2016-08-15 7 views
1

したがって、可変サイズの3dB行列Aがあります。 B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); ...; squeeze(A(n,:,:))]のような行列を積み重ねるコマンドを使いやすいですか?スタックサブマトリクス3d行列を1つの行列にします

は今、私は以下のものを使用しますが、その面倒は:

if(length(A(:,1,1))==1) 
    B =squeeze(A); 
else 
    B = zeros(length(A(:,1,1)*length(A(1,:,1)), length(A(1,1,:))); 
    B(1:length(A(1,:,1)),:) = squeeze(A(1,:,:)); 

    for i=2:length(A(1,:,1) 
     B(1:i*length(A(1,:,1)),:)=... 
      vertcat(B, squeeze(A(i,:,:))); 
    end 
end 

答えて

4

これはB = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); ...; squeeze(n,:,:))]と同じことをするでしょう。わからないそれがループよりも高速です:

B = num2cell(A, [2 3]); % split along first dimension into cells 
B = permute([B{:}], [2 3 1]); % concatenate the cells along second dimension 
    % and remove first dimension, which is a singleton 
4

あなたは行列の転置寸法とのpermutationreshapeを使用することができます。

C = reshape(permute(A,[3,2,1]),size(A,3),[]).'; 

優雅に任意の行数に適応します。少しテスト:

A = rand([3,4,4]); 
B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); squeeze(A(3,:,:))]; 
C = reshape(permute(A,[3,2,1]),size(A,3),[]).'; 
all(B(:)==C(:)) % should be true/1 
3

ここpermutereshape使用して1以上だ -

B = reshape(permute(A,[2,1,3]),[],size(A,3)) 
+1

クラップが、私は転置を必要とされなかったことを知っていました。よくやった。 – TroyHaskin

+0

@TroyHaskinうん! OPがヒントしたように、少なくともあなたのソリューションでは扱いにくく見えるように、 'size(A、1)* size(A、2)'を '[]'で置き換えることができました。 – Divakar

+0

うん。それは、複数の入力バージョンに対して、単一の配列規約を使用するので、私が持っているメンタルブロックです。私は今、その変更を行うつもりだと思う。 – TroyHaskin

関連する問題