【问题标题】:cellfun error : Input #2 expected to be a cell array, was double insteadcellfun 错误:输入 #2 应为元胞数组,而是双精度
【发布时间】:2020-04-07 07:36:39
【问题描述】:
field1 = 'f1';  value1 = [1 2];
field2 = 'f2';  value2 = {1, 2, 32, 'text'};
field3 = 'f3';  value3 = [pi pi.^2];
field4 = 'f4';  value4 = [1 2 3];
s = struct(field1,value1,field2,value2,field3,value3,field4,value4);

x = cellfun(@(u) numel(u), value2); %%% WORKS FINE
x = cellfun(@(u) numel(u), s.f2); %%%% THROWS ERROR
x = cellfun(@(u) numel(u.f2), s); %%%% THROWS ERROR

有人可以解释为什么最后两行会引发错误吗?错误是:

Error using cellfun
Input #2 expected to be a cell array, was double instead.

【问题讨论】:

    标签: arrays matlab struct cell


    【解决方案1】:

    cellfundocumentation 的第一行说(强调我的):

    将函数应用于元胞数组中的每个元胞

    您在第二次和第三次使用 cellfun 时没有元胞数组,因此它们不起作用。


    在您第二次使用cellfun 时,即x = cellfun(@(u) numel(u), s.f2);
    s.f2 返回一个逗号分隔的列表。要使用cellfun 获得相同的结果,您可以将逗号分隔的列表连接到一个元胞数组中,然后连接cellfun,如下所示:

    x = cellfun(@(u) numel(u), {s.f2});
    

    cellfun 的第三个用法中,您正在输入一个向量结构。在这种情况下,为了得到相同的结果,您可以像这样更方便地应用arrayfun

    x = arrayfun(@(u) numel([u.f2]), s);
    

    【讨论】:

      【解决方案2】:

      对于第 3 次调用,您创建的结构 s 称为“Nonscalar Struct Array”,因为您的 f2 元素是非标量元素的元胞数组。除了@Sandar 提供的解决方案,您还可以这样做

      x=cellfun(@numel, {s(:).f2})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多