2016-08-15 171 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