使用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
解决方案。但没有比这更快的了。
你不需要任何疯狂的东西,只需要 reshape
和 num2cell
c = reshape(num2cell([m1(:), m2(:), m3(:), m4(:)], 2), size(m1));
我认为这是一个很好的通用方法。
编辑:2015/07/25 14:45
根据您的评论,您拥有的似乎是元胞数组
M = {m1, m2, ..., mn}
我想你是说每个 m 是 2x2,但我假设它是 q
xr
并且您想以表格形式获取它,
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
之一的大小相同。
我有四个 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
解决方案。但没有比这更快的了。
你不需要任何疯狂的东西,只需要 reshape
和 num2cell
c = reshape(num2cell([m1(:), m2(:), m3(:), m4(:)], 2), size(m1));
我认为这是一个很好的通用方法。
编辑:2015/07/25 14:45
根据您的评论,您拥有的似乎是元胞数组
M = {m1, m2, ..., mn}
我想你是说每个 m 是 2x2,但我假设它是 q
xr
并且您想以表格形式获取它,
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
之一的大小相同。