我有四个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做这件事吗?
答案 0 :(得分:0)
这似乎是一个纯粹的语法问题。
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
解决方案。但没有比这更快的了。
答案 1 :(得分:0)
您不需要任何疯狂的事情,只需reshape
和num2cell
c = reshape(num2cell([m1(:), m2(:), m3(:), m4(:)], 2), size(m1));
我认为这是一种很好的通用方法。
编辑:2015/07/25 14:45
根据您的评论,您似乎拥有的是一个单元格数组
M = {m1, m2, ..., mn}
我认为你说每个m都是2x2,但我认为它是q
x r
你希望以表格形式获得它,
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
之一的大小相同。