【问题标题】:Return the cells in a cell array that don't contain all zeros in matlab在matlab中返回不包含全零的单元格数组中的单元格
【发布时间】:2026-01-17 05:50:02
【问题描述】:

我有一个包含许多单元格的单元格数组 A,每个单元格有 50 个值。单元格要么全为零,要么是其他数字的组合。

我正在寻找一种方法来确定哪些单元格不全为零,因为我想将它们绘制在图表中。如果我尝试绘制单元格数组中的所有单元格,那么 matlab 无法处理。所以理想情况下,我会得到一个列表,例如 A{1}、A{53}、A{235} 等,它们不是由全零组成的。

查看此处时,我发现了如何在数组或矩阵中查找非零值,但我没有看到任何关于查找具有非零值的单元格的信息。

非常感谢您的任何帮助!

【问题讨论】:

    标签: arrays matlab plot find cell-array


    【解决方案1】:

    让我们考虑示例数据

    a=[{randi(10,1,50)} {randi(10,1,50)} {zeros(1,50)} {randi(10,1,50)}]
    

    然后你可以找到不完全包含零的单元格的索引,如下所示:

    nonzeroind=find(~cellfun(@(x) all(x==0),a))
    

    如果存储在单元格中的矩阵有多个非单维,则您必须应用 all 的次数与最高维度单元格中的维度一样多,如下所示:

    nonzeroind=find(~cellfun(@(x) all(all(x==0)),a))
    

    存储在单元格中的矩阵的大小与这种方法无关。

    【讨论】:

    • 您好,非常感谢您抽出宝贵时间帮助我。当我应用 nonzeroind=~cellfun(@(x) all(x==0),a) 时,我最终得到所有单元格全为零。我知道我的单元格数组有一些具有非零值的单元格,所以我不确定发生了什么。您对我可能在这里遗漏的内容有任何想法吗?非常感谢!
    • @Anonymous 这很奇怪,因为它适用于我的示例数据。您能否将变量保存在 .mat 文件中并将其上传到您的问题中?另请注意,我添加了find 以将逻辑输出转换为线性索引。
    【解决方案2】:

    如果单元格包含 100 个单元格 x 50 行,为什么不将其转换为双矩阵?因为根据您的问题,所有值似乎都是双倍的,只是数字。

    首先制作你的单元格,加倍:

        m=zeros(size(a,1),size(a,2));
        m=str2double(a);
    % from https://www.mathworks.com/matlabcentral/answers/18509-cell-conversion-to-double
    %Then you can just convert 0's to NaN's and plot all freely
       m(m==0) = NaN;
    

    【讨论】: