2011-02-04 14 views
4

私はN^2行列を持っています。 それぞれは3x3マトリックスです。 3Nx3N行列にそれらを連結に 一つの方法は、 A(:,:,i)= # 3x3 matrix i=1:N^23 Nx3N行列へのN^2 3x3行列の連結

matrix

B=[A11 A12 ..A1N;A21 ...A2N;...] を書くことです。しかし、Nが大きい場合には面倒な作業です。 何を提供していますか?

+0

私は、これにつながる関連したクォーテーションのbeforを持っていた、それはあった:http://stackoverflow.com/questions/4889496/3n-linear-equations – Abolfazl

答えて

6

はここだけRESHAPEPERMUTEを使用しています本当に速いワンライナーです:

>> N=2; 
>> A = rand(3,3,N^2) 
A(:,:,1) = 
    0.5909 0.6571 0.8082 
    0.7118 0.6090 0.7183 
    0.4694 0.9588 0.5582 
A(:,:,2) = 
    0.1791 0.6844 0.6286 
    0.4164 0.4140 0.5833 
    0.1380 0.1099 0.8970 
A(:,:,3) = 
    0.2232 0.2355 0.1214 
    0.1782 0.6873 0.3394 
    0.5645 0.4745 0.9763 
A(:,:,4) = 
    0.5334 0.7559 0.9984 
    0.8454 0.7618 0.1065 
    0.0549 0.5029 0.3226 

>> B = reshape(permute(reshape(A,3,3*N,N),[2 1 3]),3*N,3*N).' 
B = 
    0.5909 0.6571 0.8082 0.1791 0.6844 0.6286 
    0.7118 0.6090 0.7183 0.4164 0.4140 0.5833 
    0.4694 0.9588 0.5582 0.1380 0.1099 0.8970 
    0.2232 0.2355 0.1214 0.5334 0.7559 0.9984 
    0.1782 0.6873 0.3394 0.8454 0.7618 0.1065 
    0.5645 0.4745 0.9763 0.0549 0.5029 0.3226 
+0

+1:それは私のバージョンよりもさらに良い! – Jonas

+0

私はこれが大きさの速さであることを確認できます+1 – Amro

+0

うわー、それは甘いです。 +1 –

3

次のコードを試してみてください。

N = 4; 
A = rand(3,3,N^2);      %# 3-by-3-by-N^2 

c1 = squeeze(num2cell(A,[1 2])); 
c2 = cell(N,1); 
for i=0:N-1 
    c2{i+1} = cat(2, c1{i*N+1:(i+1)*N}); 
end 

B = cat(1, c2{:});      %# 3N-by-3N 
2

あなたはNのためにその優れた

B = cell2mat(reshape(mat2cell(A,2,2,ones(N^2,1)),N,N)'); 

を好きならmat2cellここで

N = 2; 
A = rand(3,3,N^2); 

C = mat2cell(A,3,3,ones(N^2,1)); 
C = reshape(C,N,N)'; %'# make a N-by-N cell array and transpose 

%# catenate into 3N-by-3N cell array 
B = cell2mat(C); 

reshapeが関与する別の可能性は、1行でも同じです= 2

>> A = rand(3,3,N^2) 
A(:,:,1) = 
     0.40181  0.12332  0.41727 
    0.075967  0.18391  0.049654 
     0.23992  0.23995  0.90272 
A(:,:,2) = 
     0.94479  0.33772  0.1112 
     0.49086  0.90005  0.78025 
     0.48925  0.36925  0.38974 
A(:,:,3) = 
     0.24169  0.13197  0.57521 
     0.40391  0.94205  0.05978 
    0.096455  0.95613  0.23478 
A(:,:,4) = 
     0.35316  0.043024  0.73172 
     0.82119  0.16899  0.64775 
    0.015403  0.64912  0.45092 

B = 
     0.40181  0.12332  0.41727  0.94479  0.33772  0.1112 
    0.075967  0.18391  0.049654  0.49086  0.90005  0.78025 
     0.23992  0.23995  0.90272  0.48925  0.36925  0.38974 
     0.24169  0.13197  0.57521  0.35316  0.043024  0.73172 
     0.40391  0.94205  0.05978  0.82119  0.16899  0.64775 
    0.096455  0.95613  0.23478  0.015403  0.64912  0.45092 
1

旧式の事前割り振りとループを使用してみませんか?かなり速くなければならない。

N = 4; 
A = rand(3,3,N^2); % Assuming column major order for Aij 
8 
B = zeros(3*N, 3*N); 
for j = 1:N^2 
    ix = mod(j-1, N)*3 + 1; 
    iy = floor((j-1)/N)*3 + 1; 
    fprintf('%02d - %02d\n', ix, iy); 
    B(ix:ix+2, iy:iy+2) = A(:,:,j); 
end 

EDIT:スピードのためにここに中毒アウトがランキングは以下のとおりです。

B = reshape(permute(reshape(A,3,3*N,N),[2 1 3]),3*N,3*N).'; 

とテスト:

N = 200; 
A = rand(3,3,N^2); % test set 

@gnovice solution: Elapsed time is 0.013069 seconds. 
@Amro solution: Elapsed time is 0.203308 seconds. 
@Rich C solution: Elapsed time is 0.887077 seconds. 
@Jonas solution: Elapsed time is 7.065174 seconds.