我没有太多使用Matlab的经验,这就是为什么我在这里提出这个问题以获得一些开始寻找的方向。
我有这段代码:
A = A - A(:,i)*(A(i,:)/(delta + A(i,i)));
A矩阵是216x31285,这意味着这个计算的执行次数非常昂贵。它针对每个数据集(28)执行所有行(216),因此它所花费的0.192秒自然是相当多的。关于如何加快速度的任何想法?
答案 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)
在第三步中,这与第一步相同。等等。