【问题标题】:How to remove zero entries inside a cell array in MATLAB?如何在 MATLAB 中删除单元格数组中的零条目?
【发布时间】:2013-09-11 12:08:56
【问题描述】:

我在 MATLAB 中有一个单元格数组,比如说cell_arr,它有零条目以及非零单元格条目。例如:

cell_arr = {0, 0, 0, 0, 0, {1x3 cell}, {1x3 cell}, {1x3 cell}, {1x3 cell}};

有人能告诉我如何从cell_arr 中删除这些零条目,或者找到非零条目的索引吗?此外,我想避免使用for 循环来执行这项工作。

我已经尝试过find 函数,但是find 函数不适用于元胞数组。我想知道是否存在执行此工作的单行语句/表达式?

【问题讨论】:

    标签: matlab cell-array


    【解决方案1】:

    据我所知,没有单行功能。你必须结合一些功能。 第一行查找元胞数组中的零,而第二行删除这些条目。请注意 () 括号 i.s.o。 {} 删除。

    试试这个:

    idxZeros = cellfun(@(c)(isequal(c,0)), cell_arr);
    cell_arr(idxZeros) = [];
    

    【讨论】:

    • 使用函数isequal(c,0)避免使用两个测试~iscell(c) && c == 0
    • @Magla 是的,但是我认为这更容易调试,因为人们应该明白,只要第一个测试失败,第二个测试就不会被执行。
    • @Nick:我认为 C_pruned = C(~cellfun(@(x)isequal(x,0), C))...不过,+1 :)
    • @Nick 我同意罗迪的观点。 isequal(c, 0)~iscell(c) 一样易于阅读/调试,而且它是一个比使用~iscell(c) 更通用的解决方案。如果元胞数组包含不是元胞且非零的对象,c == 0 可能会触发错误。
    • @EitanT & Rory,这些都是我没想到的。谢谢!
    【解决方案2】:
    cell_arr(cellfun(@(x) ~x(1),cell_arr(:,1)),:) = []
    

    如果可行,请告诉我。

    【讨论】:

    • 返回cell_arr = {}(0x9)
    • @尤纳斯。谢谢回复。不,它不工作。它给出了空单元格数组。尼克给出的答案(第一条评论)有效。
    猜你喜欢
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多