如何在单元格数组中矢量化调用函数?

时间:2016-11-25 10:42:06

标签: matlab vectorization func

我有一个矩阵

x = rand(10,100,3);

和一个函数单元数组:伪代码是

funcca = {...
    @(v)(v(1)+v(2)), @(v)(v(1)-v(2)), ......,   @(v)(v(1)+v(2)+v(3)^2);
    ⋮
    ⋮
    @(v)(v(1)^6+sqrt(v(3))), @(v)(sin(v(1))-cos(v(2))),......,@(v)(v(1))
};

其中size(funcca) = [10, 100]。这意味着funcca中的每个函数都不同!

现在我使用以下代码计算y

y = nan(10,100);
for i = 1 :10
    for j = 1:100 
        y(i,j) = funcca{i,j}(squeeze(x(i,j,:)));
    end
end

有没有办法可以避免这两个for循环或向量化这个过程?

2 个答案:

答案 0 :(得分:0)

matlab函数cellfun将允许您对单元格数组中的每个元素执行操作。在这种情况下:

y = cellfun(@(c)c(rand(1, 3)), funcca);

或者如果x实际上应该是显式数据,而不是像您的问题中那样随机生成,那么<​​/ p>

y = cellfun(@(fh, data)fh(squeeze(data)), funcca, num2cell(x, 3));

答案 1 :(得分:0)

实际上,对cellfun的调用应如下所示:

z = cellfun(@(f,y) f(y), funcca, num2cell(x,3));

但是,正如obchardon所说,这可能实际上并没有让你加快速度。它只是为您节省一些打字。

实际上,我认为这更像是一个设计问题 - 你是如何最终获得这一系列功能的?你能提供一些背景吗?