【问题标题】:Removing elements from a cell array in MATLAB从 MATLAB 中的元胞数组中删除元素
【发布时间】:2016-10-26 04:40:24
【问题描述】:

我有一个单元格数组,如下所示:

a = {[1 2 3] [5 3 6] [9 1 3]};

现在我想从 a 中包含 1 的每个数组中删除 1,以便输出如图所示

a = {[2 3] [5 3 6] [9 3]};

我知道单元格数组“a”中包含 1 的数组的索引。这可以使用 for 循环和一个临时变量来完成,但这需要很多时间(我想在大小类似于 1x100000 的单元阵列。上面的只是一个示例)

我想知道有没有直接的方法可以快速做到这一点。

【问题讨论】:

    标签: arrays matlab indexing cell-array


    【解决方案1】:

    对于这么大的单元阵列,几乎任何事情都会变慢。您可以尝试使用 cellfun 执行此操作,但不一定保证比 for 循环快。

    a = cellfun(@(x)x(x ~= 1), a, 'UniformOutput', false);
    
    %   a{1} =
    %        2     3
    %   a{2} =
    %        5     3     6
    %   a{3} =
    %        9     3
    

    【讨论】:

      【解决方案2】:

      正如 Suever 已经评论的那样,因为您使用的是单元格数组并且它是一个动态容器,所以如果您想修改内容,您别无选择,只能遍历每个单元格。只是为了自成一体,这里是for循环做事的方法:

      for ii = 1 : numel(a)
          a{ii} = a{ii}(a{ii} ~= 1);
      end
      

      这可能会更快,因为它不会承受cellfun 的开销。上面的代码访问每个单元格中的向量并提取那些不等于 1 的值并用这个新向量覆盖相应的单元格。

      使用您的示例:

      a = {[1 2 3] [5 3 6] [9 1 3]};
      

      我们得到:

      >> format compact; celldisp(a)
      a{1} =
           2     3
      a{2} =
           5     3     6
      a{3} =
           9     3
      

      【讨论】:

        【解决方案3】:

        此示例说明如何从单个单元格中删除数据,以及如何从单元格数组中删除整个单元格。要运行此示例中的代码,请创建一个 3×3 元胞数组:

        C = {1, 2, 3; 4, 5, 6; 7, 8, 9};
        

        通过将空数组分配给单元格来删除特定单元格的内容,使用花括号进行内容索引,{}:

        C{2,2} = []
        

        此代码返回

        C = 
            [1]    [2]    [3]
            [4]     []    [6]
            [7]    [8]    [9]
        

        使用带有圆括号 () 的标准数组索引删除单元格集。比如这个命令

        C(2,:) = []
        

        删除C的第二行:

        `

        C = 
            [1]    [2]    [3]
            [7]    [8]    [9]`
        

        【讨论】:

        • 给出的输入与问题中提供的不同。您正在将单个元素创建为单元格,而问题将 向量作为单元格元素。这是切线,我认为这对回答这个问题没有建设性。如果您在此评论中发现冒犯,我深表歉意,但这并不能回答问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多