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)
但这会做太多计算而不是需要.
任何智能解决方案 你可以假设计算中没有奇点问题.
自 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 循环版本快得多。
有些问题不适合矢量化。我认为这是其中之一。