Matlab 将子矩阵3d矩阵堆叠在一个矩阵中

Matlab 将子矩阵3d矩阵堆叠在一个矩阵中,matlab,matrix,multidimensional-array,vectorization,Matlab,Matrix,Multidimensional Array,Vectorization,假设我有一个大小可变的3d矩阵a。是否有一个易于使用的命令来堆叠矩阵,如B=[挤压(A(1,:,:);挤压(A(2,:,:);…;挤压(A(n,:,:))] 现在我使用以下方法,但它很麻烦: 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

假设我有一个大小可变的3d矩阵
a
。是否有一个易于使用的命令来堆叠矩阵,如
B=[挤压(A(1,:,:);挤压(A(2,:,:);…;挤压(A(n,:,:))]

现在我使用以下方法,但它很麻烦:

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

这将与
B=[挤压(A(1,:,:);挤压(A(2,:,:);…;挤压(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

这将与
B=[挤压(A(1,:,:);挤压(A(2,:,:);…;挤压(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
您可以使用矩阵的一个维度和一个转置:

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
您可以使用矩阵的一个维度和一个转置:

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
这里还有一个使用和-

这里还有一个使用和-


糟了,我知道不需要转置。干得好。@TroyHaskin是的!至少您可以使用
[]
来替换
大小(A,1)*大小(A,2)
以使其在解决方案中看起来不那么麻烦,正如OP所暗示的那样!是 啊这只是我的一个心理障碍,因为我使用单数组约定而不是多输入版本。我想我现在就要改变了。糟了,我知道不需要转置。干得好。@TroyHaskin是的!至少您可以使用
[]
来替换
大小(A,1)*大小(A,2)
以使其在解决方案中看起来不那么麻烦,正如OP所暗示的那样!是 啊这只是我的一个心理障碍,因为我使用单数组约定而不是多输入版本。我想我现在就要改变了。