【问题标题】:put matrices into an empty cell using matlab使用matlab将矩阵放入一个空单元格
【发布时间】:2015-07-24 16:10:57
【问题描述】:

我有四个 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做这个?

【问题讨论】:

    标签: matlab matrix cell-array


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的帮助。如何为未知数量的 m 矩阵编辑此代码?我的意思是我有四个 m 矩阵,称为 m1,m2,m3,m4 但在我的一般代码中,由于输入的块数我们可能有 4,8,16... 数量。
    • 首先,如果您要拥有任意数量的矩阵,您应该考虑使用元胞数组。但如果这不是一个选择,你可以这样做,这会让你看起来很脏。 n = 16; c = reshape(num2cell(eval(['[', strjoin(arrayfun(@(i) strcat('m', num2str(i), '(:)'), (1:n), 'uni', 0), ' '), ']', ]), 2), size(m1));
    • 是的,我有一个 1*4 元胞数组,它的元素是 m 个矩阵,我想按照我上面所说的方式重塑它们,但正如我所说,元胞数组元素不是固定的 4矩阵并基于输入块编号,我可能有 8,16.... 数量。我粘贴了您的代码,但它在“strjoin”上出现错误,因为我的输入值是单元格,我该如何更改它以用于单元格数组输入?
    • 我不知道为什么eval 语句不起作用。我创建了一组m 矩阵,就像你描述的那样。 n = 16; eval(strjoin(arrayfun(@(i) strcat('m', num2str(i), ' = rand(2); '), (1:n), 'uni', 0), ' '));。然后我运行了c = reshape(num2cell(eval(['[', strjoin(arrayfun(@(i) strcat('m', num2str(i), '(:)'), (1:n), 'uni', 0), ' '), ']', ]), 2), size(m1)); 发布的代码,它运行良好。
    • 查看编辑。我认为您需要的代码是c = reshape(num2cell(cell2mat(cellfun(@(m) m(:), M(:)', 'uni', 0)), 2), size(M{1}));
    【解决方案2】:

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

    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 解决方案。但没有什么比这更快了。

    【讨论】:

    • 是的,我的确切问题是这些矩阵的数量发生了变化,但我不知道该怎么做。如果你能帮我解决这个问题,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多