我的代码中有for循环(如下所示)需要一段时间才能运行。 CALC是我定义的函数; Dis a矩阵; Y是一个矩阵; k是一个向量。有没有办法可以对这段代码进行矢量化,以便我不再使用for循环?任何贡献都将受到高度赞赏。
for column = 1:n
q(:,column) = CALC(D,Y(:,column), k(column));
end
CALC功能概述如下:
function [x] = CALC(A, y, s)
[m, n] = size(A);
% y is an m x 1 vector
% s is an integer
r = y;
index_cols = [];
atoms = [];
for i = 1 : s
[max_r, lambda_t] = max(abs(r'*A));
index_cols = [index_cols, lambda_t];
atoms = [atoms, A(:,lambda_t)];
x_t = pinv(atoms)*y;
r = y - atoms*x_t;
end
x = zeros(n,1);
x(index_cols) = x_t;
end
答案 0 :(得分:3)
我将扩展关于rayryeng的评论。矢量化意味着将一些基本操作组合在一起,使得它们可以由低级例程共同处理。但是代码的大部分执行时间是pinv(atoms)
的计算;其他一切都不是那么贵。
你可以考虑的事情:
缓存。您的代码计算矩阵的伪逆,这些矩阵总是由相同矩阵D的列组成。因此,可能会多次使用相同的atoms
输入调用pinv。调查这是否经常发生,以保证缓存伪逆。 Here's an example of caching Matlab results
并行化,如果你有硬件和软件。
重新思考算法...