我一直试图将此代码矢量化一段时间,但一直无法做到。有人可以帮忙吗。
%X -[153600x400]
%W -[153600x500]
%beta=error=scalar
%errvals=[40x1]
%n=400
iter = 1;
for ii = 1:n
disp(ii);
x = X(:,ii);
y = W'*x;
W = beta*x*y' + W - beta*W*tril(y*y');
beta = options.rate*options.annealfunc(iter);
err = err + sum((x - W*(W'*x)).^2);
errvals(iter) = err/iter;
if (any(~isfinite(W)))
warning(sprintf('Lost convergence at iterator %i; lower learning rate?', niter));
success = 11;
break;
end;
if (options.printerr == 1)
fprintf('Error = %d; Iteration = %i\n', err/iter, iter);
end;
iter = iter+1;
end;
答案 0 :(得分:1)
矢量化并没有“神奇”突然改善性能,它基本上削减了函数调用和迭代的开销。在您的情况下,一个包含400次迭代并且只有一些函数调用的循环,开销很小。
没有实际运行代码,因为我没有所有输入(至少options.annealfunc
缺失)我猜大多数时间都花费在执行矩阵乘法上。提高矩阵乘法性能的正确方法是在GPU上运行它们。假设您拥有兼容的图形卡和分布式计算工具箱的许可证,则必须将阵列转换为gpuArrays
< / p>