【问题标题】:Apply a function to each sub-cell of a cell in Matlab?将函数应用于Matlab中单元格的每个子单元格?
【发布时间】:2015-09-13 21:33:37
【问题描述】:

我在 Matlab 中有一个单元格 C,尺寸为 mx1,例如m=3

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

然后我有一个函数g写在一个单独的m文件中

function D=g(C{i},a,b)
...
end

采用C 的任何子单元C{i} 并使用其他一些参数a 和b 给出维度fx1 的向量D。

我想将函数g 应用于C 的每个子单元格,并将获得的fx1 向量组装到矩阵fxm 中而不使用循环。我看过命令cellfun,但我不知道如何使它与我自己编写的函数一起工作。有什么建议吗?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    简单。首先对唯一输入是元胞数组的函数进行句柄:

    h = @(x) D(x, a, b);
    

    这里,x 将是元胞数组中的一个元胞。另外,我将假设您的工作区中已经定义了a 和b。之后,只需这样做:

    out = cellfun(h, C, 'uni', 0);
    

    第一个参数是我们已经定义的函数句柄。下一个参数是您要操作的单元格数组,并将函数h 应用于数组中的每个单元格。您需要指定uni=0 标志,因为输出是非统一。因为您的函数会为每个单元格输出一个向量,所以这是强制性的。如果您的函数输出单个值,则不需要声明 uni=0。

    或者,您可以在循环中执行此操作...这是 cellfun 最终执行的操作:

    out = cell(numel(C), 1);
    for idx = 1 : numel(C)
        out{idx} = D(C{idx}, a, b);
    end
    

    对我来说,第二个选项更适合那些不习惯使用cellfun的人。

    【讨论】:

    • @user3285148 三件事,1) 你不需要定义匿名函数,你可以内联out = cellfun(@(x) g(x, a, b), C, 'uni', 0);。 2)如果你所有的输入都是相同大小的单元格,那么你可以说out = cellfun(@g, C, a, b, 'uni', 0);。 3) 如果a 和b 是与C 大小相同的矩阵,则可以将输入转换为单元格,out = cellfun(@g, C, num2cell(a), num2cell(b), 'uni', 0);。
    • @user1543042 我将它拆分为一个内联函数,以明确我在做什么。 2)我将它们解释为常量,因此是匿名包装器。 3)它们可能不是矩阵......然后我不能确定。
    • 对于 (1) 这只是一种风格偏好,对于 (2) 和 (3) 你可能是对的。我只是想确保 OP 知道一些小技巧。我觉得你的回答很好。
    • @user1543042 啊我明白了!很公平!感谢您的荣誉:)
    猜你喜欢
    • 2018-05-25
    • 2017-01-21
    • 2017-04-02
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2020-10-13
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多