【问题标题】:How can I Vectorize this For Loop in MATLAB Code?如何在 MATLAB 代码中对这个 For 循环进行矢量化?
【发布时间】:2015-09-04 20:07:59
【问题描述】:

我的代码中有 for 循环(如下所述),它需要一段时间才能运行。 CALC 是我定义的函数; Dis 一个矩阵; 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

【问题讨论】:

  • CALC 实际上是做什么的?这将有助于提供有关如何矢量化的想法。
  • 除非我们知道CALC 做了什么,否则我们不能向量化这段代码。这就像你给我们一个黑匣子,我们不知道它实际上是如何工作的,而你告诉我们让这个黑匣子运行得更快。除非我们了解您在做什么,否则不可能知道如何让它更快。
  • 感谢您的贡献@paisanco 我已更新问题以包含 CALC 函数
  • 感谢您的贡献@rayryeng 我已更新问题以包含 CALC 函数
  • 我看到了伪逆。使用它已经使您的代码不可矢量化。

标签: matlab for-loop vectorization


【解决方案1】:

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

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

你可以考虑的事情:

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

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

  3. 重新思考算法...

【讨论】:

  • Plus 1 用于扩展我的 cmets。这也是考虑矢量化的一种很好的方式。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多