Matlab 如何将多维矩阵重塑为二维矩阵,反之亦然?

Matlab 如何将多维矩阵重塑为二维矩阵,反之亦然?,matlab,matrix,Matlab,Matrix,我有一个函数f,它接受一个nxdx矩阵并返回一个nxdy矩阵。现在我有了一个n1 x dx x n2,所以我需要将它重新整形为n1*n2 x dx,然后将结果重新整形为n1 x dy x n2。这是我的代码: function main n1 = 4; n2 = 5; dx = 2; dy = 3; x = ones(n1, dx); x = bsxfun(@times, permute(1:n2, [1, 3, 2]), x) x2d = reshape(permute(x, [1 3 2])

我有一个函数
f
,它接受一个
nxdx
矩阵并返回一个
nxdy
矩阵。现在我有了一个
n1 x dx x n2
,所以我需要将它重新整形为
n1*n2 x dx
,然后将结果重新整形为
n1 x dy x n2
。这是我的代码:

function main
n1 = 4;
n2 = 5;
dx = 2;
dy = 3;
x = ones(n1, dx);
x = bsxfun(@times, permute(1:n2, [1, 3, 2]), x)
x2d = reshape(permute(x, [1 3 2]), n1*n2, dx)
y2d = f(x2d)
y = permute(reshape(y2d', dy, n1, n2), [2 1 3])

%%
% x = cat(4, x, x+3)

end

function y = f(x)
y = [x, sum(x, 2)];
end
问题从我需要更高维度的样本开始。我非常喜欢四维矩阵,比如
cat(4,x,x+n2)
。那么,有没有一个通用的解决方案来重塑这些:

n1 x dx x n2 x ... x nm -> (n1*n2*...*nm) x dx
(n1*n2*...*nm) x dy     -> n1 x dy x n2 x ... x nm

您只需
排列
第二个维度,然后执行
重塑
,反之亦然:

% assume size(arr) is [n1, dx, n2, n3, ..., nm]
permuted = permute(arr, [1, 3:ndims(arr), 2]);  % [n1, n2, n3, ..., nm, dx]
final = reshape(permuted, [], size(permuted, ndims(permuted)));
对于反向变换:

% assume size(arr) is [n1*n2*n3*...*nm, dy]
% and you have to know new_size = [n1, n2, n3, ..., nm]
% and watch out for dy == 1 case: trailing singleton is removed
reshaped = reshape(arr, [new_size, size(arr, numel(new_size)+1)]);  % [n1, n2, n3, ..., nm, dy]
final = permute(reshaped, [1, numel(new_size)+1, 2:numel(new_size)]);

您可能需要注意尺寸很少的边缘情况。

您可以重新定义
f
以采用n维数组,而不是执行多个重塑和置换

function y = f(x)
    y = cat(2,x,sum(x,2));
end

你不能重新定义f,这样它就可以接受一个n维数组吗?@rahnema1,好吧,有几十个!这些实际上是预定义的成本函数。所以我真的不想惹他们。尽管如此,我还是发布了一个答案。正如我之前所说,在我的情况下,重新定义
f
不是一个选择。但是你有一个观点,对那些可能来的人来说。so1+。