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

时间:2012-03-19 21:15:56

标签: matlab

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

我有这段代码:

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

A矩阵是216x31285,这意味着这个计算的执行次数非常昂贵。它针对每个数据集(28)执行所有行(216),因此它所花费的0.192秒自然是相当多的。关于如何加快速度的任何想法?

2 个答案:

答案 0 :(得分:1)

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

M = magic(5)
V = rand(5,1)
M = M.*repmat(V,[size(M,1) 1])

通常比循环的等价物快得多。

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

在您的情况下,您正在对矩阵A:

应用递归操作
A = A - f(i) = A - (prevA - f(i-1)) = ...

这意味着您无法像在矢量化代码时通常那样同时应用所有迭代。 换句话说,在每次迭代i时,矩阵A在前一次迭代时依赖于矩阵A,因此无法使用您提供的等式一次操作所有迭代。

答案 1 :(得分:1)

@ Pedro回答的附录。如果你有这样一个递归方程,你通常可以换空间。

在第一步中更新矩阵,比如说B(遵循佩德罗的符号):

B = A - f(i)

在第二步中更新A:

A = B - f(i)

在第三步中,这与第一步相同。等等。