使用Matlab将4d矩阵重新整形为矢量单元阵列

时间:2016-11-02 20:21:32

标签: matlab matrix

我有一个4D矩阵(dims - x,y,z,t)。我想将其重新整形为长度为x*y*z的1D单元数组,其中每个元素都是一个大小为t的长向量,它捕获每个卷位置(x,y,z)的所有元素。之后我需要重新塑造它。

我想过循环数组来做它,因为我无法真正找到内置函数来做它。

任何见解都会非常有用!谢谢!

3 个答案:

答案 0 :(得分:4)

看看这是否是你想要的:

x = randn(2,3,4,5); % example data
x = reshape(x, [], size(x,4)); % collapse first three dimensions
x = mat2cell(x, ones(1,size(x,1)), size(x,2)); % split first dimension into cells

答案 1 :(得分:3)

Luis的答案非常适合半矢量化(<form enctype="multipart/form-data" action="/admin/process_post/savepost/" method="POST"> 使用循环)。如果您想要的是一个大小为mat2cell的单元格数组,其中每个元素的长度为x*y*z,则可以在每个卷位置上使用循环并提取“暂时”占用的t元素这个位于4D。确保squeeze输出任何单个维度以获得结果向量。如果你想采用循环方法,这是需要考虑的事情。假设您的矩阵名为t,请尝试以下操作:

A

要将其恢复为4D矩阵形式,您只需应用相同的逻辑,但反之亦然:

B = cell(size(A,1)*size(A,2)*size(A,3), 1);
count = 1;
for ii = 1 : size(A,1) 
    for jj = 1 : size(A,2)
        for kk = 1 : size(A,3)
            B{count} = squeeze(A(ii,jj,kk,:));
            count = count + 1;
        end
    end
end

答案 2 :(得分:3)

像Luis&#39;解决方案,但更简单,更完整:

% Transform to cell
x = randn(2,3,4,5); % example data
y = reshape(x, [], size(x,4));
z = num2cell(y,2);

% transform back 
x = reshape(cat(1,z{:}), size(x));