你不需要任何疯狂的东西,只需 reshape 和 num2cell
c = reshape(num2cell([m1(:), m2(:), m3(:), m4(:)], 2), size(m1));
我认为这是一个很好的通用方法。
编辑:2015/07/25 14:45
根据您的 cmets,您所拥有的似乎是一个元胞数组
M = {m1, m2, ..., mn}
我想你是说每个 m 是 2x2,但我假设它是 qxr
而你想在表单中得到它,
c = {[m1(1,1), m2(1,1), ..., mn(1,1)], [m1(1,2), m2(1,2), ..., mn(1,2)], ..., [m1(1,q), m1(1,q), ..., mn(1,q)]
[m1(2,1), m2(2,1), ..., mn(2,1)], [m1(2,2), m2(2,2), ..., mn(2,2)], ..., [m1(2,q), m1(2,q), ..., mn(2,q)]
...
[m1(r,1), m2(r,1), ..., mn(r,1)], [m1(r,2), m2(r,2), ..., mn(r,2)], ..., [m1(r,q), m1(r,q), ..., mn(r,q)]}
如果这一切都是准确的,那么你需要的代码是
c = reshape(num2cell(cell2mat(cellfun(@(m) m(:), M(:)', 'uni', 0)), 2), size(M{1}));
所以一个很好的测试方法是创建一个M,然后运行代码
M = arrayfun(@(i) randi(100, 7, 3), 1:14, 'uni', 0);
c = reshape(num2cell(cell2mat(cellfun(@(m) m(:), M(:)', 'uni', 0)), 2), size(M{1}));
与上述代码相比,唯一的新部分是cell2mat(cellfun(@(m) m(:), M(:)', 'uni', 0))。这需要M(这是一个矩阵元胞数组)并首先将其转换为一个列向量元胞数组(由cellfun)。然后它将这些列连接成一个矩阵,每行都是一个m1(i,j), m2(i,j), ... 集。然后就像之前一样,我们将每一行拆分为一个单元数组的它自己的单元,然后 reshape 它与 m 之一的大小相同。