如何在Matlab中加速这个简单的矩阵乘法?

如何在Matlab中加速这个简单的矩阵乘法?,matlab,Matlab,我没有太多的Matlab经验,这就是为什么我在这里问这个问题,以获得一些方向开始寻找 我有以下代码: A = A - A(:,i)*(A(i,:)/(delta + A(i,i))); A矩阵为216x31285,这意味着此计算的执行次数非常昂贵。它对每个数据集(28)的所有行(216)执行,因此自然需要0.192秒。有没有关于如何加速的想法?在MATLAB中加速代码的最简单方法是利用矢量化来消除循环。不要循环每一行或每一列,而是尝试应用整个操作,例如,将矩阵M的所有行乘以适当的向量Vdo:

我没有太多的Matlab经验,这就是为什么我在这里问这个问题,以获得一些方向开始寻找

我有以下代码:

A = A - A(:,i)*(A(i,:)/(delta + A(i,i)));

A矩阵为216x31285,这意味着此计算的执行次数非常昂贵。它对每个数据集(28)的所有行(216)执行,因此自然需要0.192秒。有没有关于如何加速的想法?

在MATLAB中加速代码的最简单方法是利用矢量化来消除循环。不要循环每一行或每一列,而是尝试应用整个操作,例如,将矩阵
M
的所有行乘以适当的向量
V
do:

M = magic(5)
V = rand(5,1)
M = M.*repmat(V,[size(M,1) 1])
一般来说,将比等效for循环快得多

矢量化的实际实现是针对每个问题的,但非常有用的运算符是元素运算符,例如:
*/^
等。此外,
repmat
函数也非常有用

然而,在您的情况下,您将对矩阵a应用递归操作:

A = A - f(i) = A - (prevA - f(i-1)) = ...
这意味着您不能像通常对代码进行矢量化时那样一次应用所有迭代。
换句话说,在每次迭代中,矩阵
A
取决于上一次迭代中的矩阵
A
,因此不可能使用您提供的方程同时运行所有迭代。

是@Pedro答案的补充。如果你有这样一个递归方程,你通常可以用空间换取时间

在第一步中,您更新一个矩阵,比如B(按照Pedro的表示法):

在第二步中,您将更新:

A = B - f(i)

第三步和第一步一样。等等。

这取决于delta是什么,以及您在多处理器机器上工作时需要什么代码,您是否有并行计算工具箱?如果是这样,请考虑将其简单化为<代码> PAROF/<代码>循环,而不是< <代码>循环()的<代码>。注意,这是使Matlab变得烦人的事情之一。例如,在Python中,基本上相同的代码将用于您想要执行的操作,但使用多处理模块、PyCUDA或mpi4py,您可以利用多处理器或GPU的性能,而无需购买并行计算工具箱的额外成本。同时请注意,这在不同的数据集之间应该是令人尴尬的并行,因此您至少可以运行几个不同的Matlab会话,每一个都会在使用旧的数据集时获取新的数据集。这看起来不对。您正在将
i
从1索引到216,但是
A(:,i)
运行到31285。你确定你要找的不是
A(i,:).*A(i,:)
吗?我用Jacket在GPU上运行了这段代码,速度提高了100倍。
A = B - f(i)