【问题标题】:MATLAB - Using mat2cell to divide a MxN matrix into 1xM cell with different sizes withinMATLAB - 使用 mat2cell 将 MxN 矩阵划分为具有不同大小的 1xM 单元
【发布时间】:2017-09-15 13:50:46
【问题描述】:

这就是问题所在:

我有一个大小为MxN 的矩阵,我想把它分成一个大小为1xM 的单元格,但单元格的每一行M 包含一个大小为1xNi 的数组(这意味着数组有不同的大小)。

我正在尝试使用 mat2cell 函数执行此操作,但我想避免使用循环,但我不知道该怎么做。

我将尝试用一个例子来解释我的问题。假设我有一个矩阵

X = [1,4,6,9; 2,3,6,7; 5,9,8,7; 9,8,7,10]

我想要代码做的是获取每行的值 X<=6 并将它们放入 1xM 单元格中。所以答案应该是:

ans =


C{1} = [1,4,6]
C{2} = [2,3,6]
C{3} = [5]
C{4} = []

到目前为止,我已经创建了一个循环,它遍历矩阵的所有行以找到满足条件的元素:

for i = 1:Mrows
    C{i} = X(i,X(i,:)<=6,:);
end

这给了我想要的结果,但特别是当矩阵的大小非常大时需要太多时间。

【问题讨论】:

    标签: arrays matlab matrix cell cell-array


    【解决方案1】:

    您可以使用num2cell(A,2) 将每一行转换为一个单元格,然后应用cellfun 删除小于6 的值:

    X = [1,4,6,9; 2,3,6,7; 5,9,8,7; 9,8,7,10];
    C = num2cell(X,2);
    res = cellfun(@(x) x(x<=6),C,'UniformOutput',0);
    

    你会得到:

    {
     [1,4,6];
     [2,3,6];
     [5];
     []
    }
    

    【讨论】:

    • 我试过了,效果很好!而且比我写的更简单!谢谢:)。
    【解决方案2】:

    您可以考虑预分配内存,即在开始填充之前创建一个空的C 元胞数组:

    X = [1,4,6,9; 2,3,6,7; 5,9,8,7; 9,8,7,10];
    Mrows = numel(X(:,1));
    
    C = cell(Mrows,1); %preallocate memory
    
    for i = 1:Mrows
        C{i} = X(i,X(i,:)<=6,:);
    end
    

    【讨论】:

      猜你喜欢
      • 2016-06-03
      • 1970-01-01
      • 2015-09-21
      • 2011-05-31
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2016-03-08
      相关资源
      最近更新 更多