我具有矩阵如何在单元格数组中向量化调用函数?
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
环或矢量化这个过程?
松散地说,矢量化是关于将数组输入的每个元素的函数的多个调用转换为整个数组的单个调用。但这里的问题是调用1000个不同的函数而不是循环,所以没有地方进行矢量化。 – rahnema1
你的功能必须是矢量化的,而不是你称之为的方式。 –
我认为你的主要性能问题是循环内部的'挤压';这不是一个MATLAB内置的,也就是说,JIT不能编译它,你会得到糟糕的性能。只需在循环前执行'permute'并调整循环内的提取索引,这应该可以显着改善事情。 –