matlab - 如何在没有for循环的情况下在matlab中计算这个

标签 matlab for-loop matrix

由于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/

相关文章:

MATLAB 黑洞变量

matlab - 使用反向传播算法进行字符识别测试

java - 尽管位于嵌套 for 循环内,如何返回数组值?

Java:增强的 for 循环,数组大小未知

r - 使用 R 中矩阵中不同行的值填充矩阵中的缺失值

CLIPS(专家系统)与C的通信——CLIPS与MATLAB

MATLAB 心脏曲线

c++ - 在 for 循环中使用++counter 而不是 counter++

Python:按列值分隔矩阵

c - 二维数组不打印正确的输出