【问题标题】:How can I omit a row-operation for elements in the diagonal如何省略对角线元素的行操作
【发布时间】:2019-02-07 03:14:03
【问题描述】:

我正在尝试创建一个使用高斯消元法求解线性系统的程序。该计划应由两部分组成。前向阶段和反向替换阶段。

现在我正在推进阶段。但是,我想不出一种处理对角线元素的方法。

我已经尝试实现 if-statments,它应该对对角线元素下方的元素执行行操作。

function A = mygausselm(A) 

[m,n] = size(A); 

for k=1:n-1 %columns
    for i=1:m-1 %rows
        L = A(i+1,k)/A(k,k);
        A(i+1,:)= A(i+1,:)- L*A(k,:);

    end 
end
end 

取矩阵:

               [ 1   2  3 ]
        A=     [ 4   3  2 ]
               [ 7   5  4 ]

预期的输出应该在行操作之后

               [ *   *  * ]
        A=     [ 0   *  * ]
               [ 0   0  * ]

【问题讨论】:

    标签: matlab linear-algebra


    【解决方案1】:

    您的 i 索引开始错误。不要从第 1 行开始,从你工作的对角元素 k 下的下一行开始:

    for k=1:n-1 %columns
        for i=k+1:m %rows
            L = A(i,k)/A(k,k);
            A(i,:)= A(i,:)- L*A(k,:);
        end 
    end
    

    由于您知道在处理 k 列时,k 行下的所有行的前 (k-1) 个元素都为零,因此您可以避免对它们进行操作:

    for k=1:n-1 %columns
        for i=k+1:m %rows
            L = A(i,k)/A(k,k);
            A(i,k:end)= A(i,k:end)- L*A(k,k:end);
        end 
    end
    

    【讨论】:

    • 它似乎对非方阵效果不佳。我不确定你对高斯消除有多熟悉。但是我怎么能对非方阵进行优化呢?顺便说一句,谢谢!
    • 首先,这个答案是否涵盖了您最初的问题?如果是,我建议您编辑您的问题以更好地反映实际问题 - 标题有点误导。其次,您应该提出一个新问题以进行跟进,但在您这样做之前让我们考虑一下。
    • 3) 非方阵的高斯消除可能很棘手。如果你的最终目标是求解一个系统,你确定你会得到一个具有独特解决方案的系统,以便高斯消除可以工作吗? 4) 请记住,您提供的用于获取上三角矩阵的代码不适用于在处理 k 列时 A(k,k)=0 的特殊情况。在这些情况下,您还需要行交换。
    • 我很抱歉。你确实回答了我的问题。我的任务是编写一个程序,以便使用“m x n”矩阵的高斯消元法求解线性方程组。我有一些东西要添加到现有的部分(上面),比如反向替换和提到的特殊情况 A(k,k) =0
    • 不需要:)在那种情况下,你必须考虑你的系数矩阵A(mxn),如果它有一个唯一的解决方案,m行中只有n行是线性独立的。您正在解决什么样的系统并注意到性能不佳?对于几百行,我认为它应该工作得相当好/快。 (实际上我删除了之前关于高斯消除性能的评论,因为在“正常大小”的系统中应该没问题)性能方面,除了矢量化和避免不必要的操作之外,没有太多事情要做 - 在上面的答案中,我们做了。
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多