У меня есть алгоритмы нахождения определителя матрицы и его предварительного преобразования в форму верхней треугольной матрицы:
clear all;
A = rand([3 3])*100;
B = A;
N = size(A);
for K = 1 : N-1
for I = K+1 : N
for J = K:N
if J == K
aik = A(I,K);
end
A(I,J) = (A(I,J) - aik/A(K,K)*A(K,J));
end
end
end
det = 1;
for I = 1:N
det = det*A(I,I);
end
Этот код работает очень хорошо. Теперь я хотел бы разработать аналогичный алгоритм, но для случая нижней треугольной матрицы. Как я могу это сделать? Важно отметить, что мне нужно использовать MATLAB без вызова каких-либо внешних функций.
Я не понимаю. Если вы знаете, что исходная матрица имеет форму нижнего треугольника, то на самом деле вам нечего делать. Полученная верхняя треугольная матрица будет просто диагональю исходной матрицы, а определитель — просто произведением диагонали исходной матрицы. Ваш код, похоже, отлично справляется с этим. Что у вас не получается?
Нет, стартовая матрица может быть другой. Я должен преобразовать его в нижний треугольный. Я пытаюсь изменить индекс I, J, K в своем алгоритме, но матрица не остается ниже треугольной.
А, понял. Но в этом случае было бы лучше, если бы вы опубликовали код, который не работает, чтобы мы могли прокомментировать его и предложить исправления.
Хорошо, это немного интереснее, чем я думаю. Моя ошибка заключается в синтаксисе языка MATLAB. Потому что, когда я использую приращение, например K = 1 : N-1
, я не могу записать значение приращения (1), НО, если я использую уменьшение в другом направлении, например K = N-1:1
, я должен строго определить его как -1, я имею в виду K = N-1:-1:1
. Я думаю, что это ответ на вопрос.
как вы думаете, это нормально, что ваша результирующая верхняя матрица не соответствует результирующей верхней матрице [L,U]=lu(A) ?
Также поймите, что N = size(A) создает двухэлементный вектор, а не одно значение. Таким образом, ваше последующее использование N в циклах for, вероятно, не то, что вы намеревались. Вместо этого вам, вероятно, следует использовать N = size(A,1).
@JohnBG, конечно да. Это не разрезание по диагонали, это более сложный алгоритм нахождения определителя. Вы можете сравнить результаты, используя внутреннюю функцию det
Правильное решение:
clear all;
A = rand([5 5])*100;
det(A);
B = A;
N = size(A);
for K = N:-1: 1
for I = K-1:-1: 1
for J = N:-1:1
if J == K
aik = A(I,K);
end
A(I,J) = (A(I,J) - aik/A(K,K)*A(K,J));
end
end
end
det = 1;
for I = N:-1:1
det = det*A(I,I);
end
пожалуйста, добавьте также объяснение .. как ваш код решает проблему.
Более конкретно. Что вы на самом деле пробовали? В чем "не получилось"?