Как я могу опустить операцию строки для элементов в диагонали - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь создать программу, которая решает линейные системы, используя метод исключения Гаусса.Программа должна состоять из двух частей.Фаза форварда и фаза обратного замещения.

Сейчас я работаю над фазой форварда.Однако я не могу понять метод лечения диагональных элементов.

Я пытался реализовать 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  * ]

1 Ответ

0 голосов
/ 06 февраля 2019

Ваш индекс 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
...