gpt4 book ai didi

matlab - 向量化矩阵乘法

转载 作者:行者123 更新时间:2023-12-01 15:31:32 24 4
gpt4 key购买 nike

我有一个关于在Octave上运行SOR算法的学校项目,但是我的效率很低。所以我有以下代码片段:

for ii=1:n
r = 1/A(ii,ii);
for jj=1:n
if (ii!=jj)
A(ii,jj) = A(ii,jj)*r;
end;
end;
b(ii,1) = b(ii,1)*r;
x(ii,1) = b(ii,1);
end;

如何将其向量化?我的第一次尝试是:
for ii=1:n
r = 1/A(ii,ii);
A(find(eye(length(A))!=1)) = A(find(eye(length(A))!=1))*r;
b(ii,1) = b(ii,1)*r;
x(ii,1) = b(ii,1);
end;

但是我不确定这有什么帮助。有没有更好和/或更有效的方法?

谢谢!

最佳答案

我相信您可以完全避免循环。您必须看到自己将A的对角元素作为倒数,然后为什么要使用循环。直接做。那是第一步。删除Inf,现在您想将r乘以相应行的相应非对角元素,对吗?

因此,使用repmat构造这样的矩阵,该矩阵将沿列复制元素,因为您要将相同的r乘以(1,2),(1,3),...,(1,n)。但是R具有非零对角线元素。因此使它们为零。现在您将得到A,除了对角元素为零。因此,您只需要从原始A重新添加它们即可。可以通过A=A.*R+A.*eye(size(A,1))完成。

向量化来自经验,最重要的是分析您的代码。考虑每一步是否要使用循环,如果不使用等效命令替换该步,则会跟随其他代码(例如,我构造了一个矩阵R,而您正在构造单个元素r。所以我只考虑转换r-> R,然后其余代码就位)。

代码如下:

R=1./(A.*eye(size(A,1))); %assuming matrix A is square and it does not contain 0 on the main diagonal
R=R(~isinf(R));
R=R(:);
R1=R;
R=repmat(R,[1,size(A,2)]);
R=R.*(true(size(A,1))-eye(size(A,1)));
A=A.*R+A.*eye(size(A,1)); %code verified till here since A comes out to be the same

b = b.*R1;
x=b;

关于matlab - 向量化矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16026585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com