2016-08-15 220 views
1

因此可以说我有一个可变大小的3d矩阵A。是否有一个易于使用的命令堆叠像B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); ...; squeeze(A(n,:,:))]这样的矩阵?在一个矩阵中堆叠子矩阵3d矩阵

现在我用下面的,但其繁琐:

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

您可以使用reshape与基体的尺寸的permutation和转置:

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 -

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

废话,我知道并不需要的转置。做得好。 – TroyHaskin

+0

@TroyHaskin是啊!至少你可以使用'[]'来代替'size(A,1)* size(A,2)',使得它在你的解决方案中看起来不那么麻烦,正如OP暗示的那样! – Divakar

+0

是的。这只是我使用单数组约定而不是多输入版本时的心理障碍。我想我现在会做出改变。 – TroyHaskin