使用matlab将矩阵放入空单元格

put matrices into an empty cell using matlab

我有四个 2*2 矩阵,分别称为 m1、m2、m3、m4。我想创建一个空的 2*2 元胞数组,它的每个元素也是 2*2 矩阵。然后我想将 m1(1,1) & m2(1,1) & m3(1,1) & m4(1,1) 元素放入创建的空单元格矩阵中,以便它们的元素 (1,1)是 m1(1,1) & m2(1,1) & m3(1,1) & m4(1,1) s。然后像我说的那样对下一个剩下的元素再做一次。

谁能帮我用 matlab 做这个?

这似乎是一个纯粹的语法问题。

c = cell(4,4);  %Create the empty cell
c{1,1} = [m1(1,1) m2(1,1); m3(1,1) m4(1,1)]; Put a constructed 2x2 matrix in position 1,1
c{1,2} = [m1(1,2) m2(1,2); m3(1,2) m4(1,2)]; 
c{2,1} = [m1(2,1) m2(2,1); m3(2,1) m4(2,1)]; 
c{2,2} = [m1(2,2) m2(2,2); m3(2,2) m4(2,2)]; 

如果你愿意,(例如,如果你的实际问题要大得多)你可以在循环中做同样的事情。甚至可能有一个聪明的 arrayfun 解决方案。但没有比这更快的了。

你不需要任何疯狂的东西,只需要 reshapenum2cell

c = reshape(num2cell([m1(:), m2(:), m3(:), m4(:)], 2), size(m1));

我认为这是一个很好的通用方法。

编辑:2015/07/25 14:45

根据您的评论,您拥有的似乎是元胞数组

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 之一的大小相同。