от Matlab lu
всегда выполняет поворотное по умолчанию. Если у вас был, например, диагональный коэффициент, равный 0, когда вы пытались выполнить обычный алгоритм декомпозиции LU, он не будет работать, поскольку диагональные коэффициенты необходимы при выполнении исключения Гаусса для создания верхней треугольной матрицы U
, чтобы вы могли получить деление на нулевую ошибку. Для обеспечения стабильной декомпозиции требуется поворот.
Однако, если вы можете гарантировать, что диагональные коэффициенты вашей матрицы отличны от нуля, это очень просто, но вам придется писать это самостоятельно. Все, что вам нужно сделать, это выполнить гауссово исключение на матрицу и уменьшить матрицу до уменьшенной формы эшелона. В результате уменьшенная матрица формы эшелона равна U
, тогда как коэффициенты, необходимые для удаления нижней треугольной части L
в гауссовом исключении, будут располагаться в нижней треугольной половине, чтобы сделать U
.
Нечто подобное может работать, если ваша матрица хранится в A
. Помните, что я предполагаю квадратную матрицу здесь. Реализация алгоритма декомпозиции LU не-поворотное помещается в функциональном файле MATLAB называется lu_nopivot
:
function [L, U] = lu_nopivot(A)
n = size(A, 1); % Obtain number of rows (should equal number of columns)
L = eye(n); % Start L off as identity and populate the lower triangular half slowly
for k = 1 : n
% For each row k, access columns from k+1 to the end and divide by
% the diagonal coefficient at A(k ,k)
L(k + 1 : n, k) = A(k + 1 : n, k)/A(k, k);
% For each row k+1 to the end, perform Gaussian elimination
% In the end, A will contain U
for l = k + 1 : n
A(l, :) = A(l, :) - L(l, k) * A(k, :);
end
end
U = A;
end
В текущем примере, предположим, что мы имеем следующий 3 х 3 матрицы:
>> rng(123)
>> A = randi(10, 3, 3)
A =
7 6 10
3 8 7
3 5 5
бег алгоритм дает нам:
>> [L,U] = lu_nopivot(A)
L =
1.0000 0 0
0.4286 1.0000 0
0.4286 0.4474 1.0000
U =
7.0000 6.0000 10.0000
0 5.4286 2.7143
0 0 -0.5000
Умножив L
и U
дает:
>> L*U
ans =
7 6 10
3 8 7
3 5 5
... который является исходной матрицей A
.
Итак, вы хотите ввести матрицу и вернуть ее две матрицы, произведение которых является такой матрицей? Зная только A, вы хотите вернуть L и U, где LxU = A? Здесь нет однозначного ответа, потому что существует множество комбинаций L и U, которые могли бы сделать A. – AndyW
Я хочу реализовать lu (A) так, чтобы он дал мне реальную нижнюю и верхнюю треугольную матрицу и L * U = A , – zer0kai
«Я хочу только умножить L * U на получение A.» Но 'lu()' делает это. Просто «L» - это перестановочный нижний треугольник. – TroyHaskin