想象一下,例如我们有以下功能:
f = @(n) sin((0:1e-3:1) .* n * pi);
g = @(n, t) cos(n .^ 2 * pi ^2 / 2 .* t);
h = @(n) f(n) * g(n, 0);
现在,我希望能够将n
的值数组输入h
并返回n
的每个值的结果总和。
我正在努力提高效率,所以我避免了新手for循环方法,只需填写预先分配的矩阵并对列进行求和。我也尝试使用arrayfun
并将单元格转换为矩阵然后对其进行求和,但它最终比for循环更慢。
有谁知道我怎么做?
答案 0 :(得分:1)
事实上,由于最近版本的MATLAB中JIT编译的改进,“新手”for循环将与任何其他矢量化解决方案一样快速竞争。
% array of values of n
len = 500;
n = rand(len,1);
% preallocate matrix
X = zeros(len,1001);
% fill rows
for i=1:len
X(i,:) = h(n(i)); % call function handle
end
out = sum(X,1);
上述速度(甚至更快):
XX = cell2mat(arrayfun(h, n, 'UniformOutput',false));
out = sum(XX,1);
这里它是在单个向量化调用中没有函数句柄的情况下直接计算的:
n = rand(len,1);
t = 0; % or any other value
out = sum(bsxfun(@times, ...
sin(bsxfun(@times, n, (0:1e-3:1)*pi)), ...
cos(n.^2 * t * pi^2/2)), 1);