由于matlab在执行for循环时很慢,所以我通常会避免所有代码都使用for循环,并将它们转化为矩阵计算,这样会很快。但是这里有一个问题,我找不到聪明的方法:
我有一个 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 x 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(:).
但这会进行过多的计算。
有什么聪明的解决方案吗?可以假设计算中不存在奇点问题。
最佳答案
自从 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(:))
结果:
Elapsed time is 0.011226 seconds. % loop
Elapsed time is 1.049130 seconds. % no-loop
ans =
5.091221148787843e-10 % results are indeed "equal"
可能有更好的方法来向量化操作,但我怀疑它会比 JIT 循环版本快得多。
有些问题不适合矢量化。我认为这是一个。
关于matlab - 如何在没有for循环的情况下在matlab中计算这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13678295/