如何在MATLAB代码中将此For循环向量化?

时间:2015-06-19 00:21:09

标签: matlab for-loop vectorization

我的代码中有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

1 个答案:

答案 0 :(得分:3)

我将扩展关于rayryeng的评论。矢量化意味着将一些基本操作组合在一起,使得它们可以由低级例程共同处理。但是代码的大部分执行时间是pinv(atoms)的计算;其他一切都不是那么贵。

  • 如果你的任务是看到几块木头,你可以把它们夹在一起,一次看到它们。这是矢量化。
  • 但是当你是一名修理几辆汽车的机械师时,这不起作用。您的大部分时间都必须花在单独的汽车上。

你可以考虑的事情:

  1. 缓存。您的代码计算矩阵的伪逆,这些矩阵总是由相同矩阵D的列组成。因此,可能会多次使用相同的atoms输入调用pinv。调查这是否经常发生,以保证缓存伪逆。 Here's an example of caching Matlab results

  2. 并行化,如果你有硬件和软件。

  3. 重新思考算法...