我有一个矩阵
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
循环或向量化这个过程?
答案 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所说,这可能实际上并没有让你加快速度。它只是为您节省一些打字。
实际上,我认为这更像是一个设计问题 - 你是如何最终获得这一系列功能的?你能提供一些背景吗?