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

Min*_*Lin 5 matlab for-loop matrix

由于matlab在执行循环时速度很慢,我通常会为所有代码避免循环,并将它们转换为矩阵计算,这会很快.但这是一个我无法找到聪明方法的问题:

我有焦虑的矩阵

A=[a1,a2,a3,...,an], 
Run Code Online (Sandbox Code Playgroud)

这里a1,a2,a3 .... an是矩阵的列.

另一个nxn矩阵

B=[b1,b2,b3,...,bn], 
Run Code Online (Sandbox Code Playgroud)

类似地,b1,b2,b3 ......也是B的列.

还有焦虑矩阵M.

我想计算nxn矩阵

C=[c1,c2,c3,...,cn], 

thus (M+diag(ai))*ci = bi.
Run Code Online (Sandbox Code Playgroud)

亦即

ci = (M+diag(ai))\bi.
Run Code Online (Sandbox Code Playgroud)

我知道没有for循环的一种方法是:

C(:)=( blkdiag(M)+diag(A(:)) )\B(:).
Run Code Online (Sandbox Code Playgroud)

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

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

Rod*_*uis 2

自 Matlab 以来,“for 循环在 Matlab 中很慢”这一说法不再普遍正确......呃,R2008a?(请有人帮我补充一下:)

不管怎样,试试这个:

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(:))
Run Code Online (Sandbox Code Playgroud)

结果:

Elapsed time is 0.011226 seconds.  % loop
Elapsed time is 1.049130 seconds.  % no-loop
ans =
     5.091221148787843e-10         % results are indeed "equal"
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来矢量化操作,但我怀疑它会比 JIT 循环版本快得多。

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