如何在MATLAB代码中对循环进行矢量化?

如何在MATLAB代码中对循环进行矢量化?,matlab,for-loop,vectorization,Matlab,For Loop,Vectorization,我的代码中有for循环(如下所述),需要一段时间才能运行。CALC是我定义的一个函数;disa矩阵;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 a

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

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

  • 如果你的任务是锯几块木头,你可以把它们夹在一起,一次锯完。这就是矢量化
  • 但如果你是一个修理几辆车的机械师,那就不行了。你的大部分时间都要花在一辆车上
您可以考虑的事项:

  • 缓存。您的代码计算总是由相同矩阵D的列组成的矩阵的伪逆。因此,它可能会使用相同的
    原子多次调用pinv。调查这种情况是否经常发生,以保证缓存伪逆

  • 并行化,如果你有硬件和软件的话

  • 重新思考算法


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

    • 如果你的任务是锯几块木头,你可以把它们夹在一起,一次锯完。这就是矢量化
    • 但如果你是一个修理几辆车的机械师,那就不行了。你的大部分时间都要花在一辆车上
    您可以考虑的事项:

  • 缓存。您的代码计算总是由相同矩阵D的列组成的矩阵的伪逆。因此,它可能会使用相同的
    原子多次调用pinv。调查这种情况是否经常发生,以保证缓存伪逆

  • 并行化,如果你有硬件和软件的话

  • 重新思考算法


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

    • 如果你的任务是锯几块木头,你可以把它们夹在一起,一次锯完。这就是矢量化
    • 但如果你是一个修理几辆车的机械师,那就不行了。你的大部分时间都要花在一辆车上
    您可以考虑的事项:

  • 缓存。您的代码计算总是由相同矩阵D的列组成的矩阵的伪逆。因此,它可能会使用相同的
    原子多次调用pinv。调查这种情况是否经常发生,以保证缓存伪逆

  • 并行化,如果你有硬件和软件的话

  • 重新思考算法


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

    • 如果你的任务是锯几块木头,你可以把它们夹在一起,一次锯完。这就是矢量化
    • 但如果你是一个修理几辆车的机械师,那就不行了。你的大部分时间都要花在一辆车上
    您可以考虑的事项:

  • 缓存。您的代码计算总是由相同矩阵D的列组成的矩阵的伪逆。因此,它可能会使用相同的
    原子多次调用pinv。调查这种情况是否经常发生,以保证缓存伪逆

  • 并行化,如果你有硬件和软件的话

  • 重新思考算法



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