【发布时间】:2016-11-02 20:21:32
【问题描述】:
我有一个 4D 矩阵 (dims - x,y,z,t)。我想将其重塑为长度为x*y*z 的一维元胞数组,其中每个元素都是一个大小为t 的长向量,它捕获每个卷位置(x,y,z) 的所有元素。之后我需要重新塑造它。
我想在数组上循环来做这件事,因为我真的找不到一个内置函数来做。
任何见解都会非常有帮助!谢谢!
【问题讨论】:
我有一个 4D 矩阵 (dims - x,y,z,t)。我想将其重塑为长度为x*y*z 的一维元胞数组,其中每个元素都是一个大小为t 的长向量,它捕获每个卷位置(x,y,z) 的所有元素。之后我需要重新塑造它。
我想在数组上循环来做这件事,因为我真的找不到一个内置函数来做。
任何见解都会非常有帮助!谢谢!
【问题讨论】:
看看这是不是你想要的:
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
【讨论】:
Luis 的答案非常适合半矢量化(mat2cell 使用循环)。如果您想要的是大小为x*y*z 的单元阵列,其中每个元素的长度为t,则可以在每个卷位置上使用循环并提取“暂时”占据4D 中该位置的t 元素。确保您 squeeze 排除任何单一维度以获得结果向量。如果您想采用循环方法,则需要考虑这一点。假设您的矩阵名为 A,请尝试以下操作:
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
要将其恢复为 4D 矩阵形式,您只需应用相同的逻辑但相反:
Ar = zeros(size(A));
count = 1;
for ii = 1 : size(A,1)
for jj = 1 : size(A,2)
for kk = 1 : size(A,3)
Ar(ii,jj,kk,:) = B{count};
count = count + 1;
end
end
end
【讨论】:
类似于 Luis 的解决方案,但更简单、更完整:
% 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));
【讨论】:
reshape 的第二个参数设为size(x) 来简化重新塑造回4D。胜过输入所有这些数字!
num2cell的双输入版本