如何在没有for循环的matlab中计算这个

时间:2012-12-03 06:35:17

标签: matlab for-loop matrix

由于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(:).

但是这会做太多计算而不是需要。

任何智能解决方案?你可以假设计算中没有奇点问题。

1 个答案:

答案 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的循环版本快得多。

有些问题不适合矢量化。我认为这是一个。