由于matlab在执行循环时速度很慢,我通常会为所有代码避免循环,并将它们转换为矩阵计算,这会很快。但这是一个我无法找到聪明方法的问题:
我有一个n x n矩阵
A=[a1,a2,a3,...,an],
这里a1,a2,a3 .... an是矩阵的列。
另一个n x n矩阵
B=[b1,b2,b3,...,bn],
类似地,b1,b2,b3 ......也是B的列。
还有一个n×n矩阵M.
我想计算n x n矩阵
C=[c1,c2,c3,...,cn],
thus (M+diag(ai))*ci = bi.
即
ci = (M+diag(ai))\bi.
我知道没有for循环的一种方法是:
C(:)=( blkdiag(M)+diag(A(:)) )\B(:).
但是这会做太多计算而不是需要。
任何智能解决方案?你可以假设计算中没有奇点问题。
答案 0 :(得分:2)
自从Matlab ... euhm,R2008a以来,语句“for循环在Matlab中很慢”已不再正常。 (有人请我填写这个:)
无论如何,试试这个:
clc
clear all
M = rand(50);
a = rand(50);
b = rand(50);
% simple loop approach
tic
c = zeros(size(b));
for ii = 1:size(b,2)
c(:,ii) = ( M+diag(a(:,ii)) ) \ b(:,ii);
end
toc
% not-so-simple vectorized approach
tic
MM = repmat({M}, 50,1);
c2 = (blkdiag(MM{:})+diag(a(:)))\b(:);
toc
norm(c(:)-c2(:))
结果:
Elapsed time is 0.011226 seconds. % loop
Elapsed time is 1.049130 seconds. % no-loop
ans =
5.091221148787843e-10 % results are indeed "equal"
可能有更好的方法来矢量化操作,但我怀疑它会比JIT的循环版本快得多。
有些问题不适合矢量化。我认为这是一个。