matlab - 向量化矩阵乘法

标签 matlab matrix octave vectorization

我有一个关于在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/

相关文章:

r - 如何找到具有最接近其均值的矩阵的行和列?在 R

java - Octave java 对脚本的无效调用

Octave -inf 和 NaN

matlab - 整理 list

matlab - “which”命令在 MATLAB 中不起作用

c# - Matlab MCR 是否支持多核?

python - 使用元素的幂创建对称数组

matlab - 为什么旋转 3D 点云后顶点法线会翻转?

math - 合并旋转轴向量

matlab - 错误: chol: input matrix must be positive definite