基于部分旋转Matlab的LU分解
我正在尝试用部分旋转实现我自己的LU分解。下面是我的代码,显然运行良好,但对于某些矩阵,与matlab中内置的基于部分旋转Matlab的LU分解,matlab,matrix,decomposition,Matlab,Matrix,Decomposition,我正在尝试用部分旋转实现我自己的LU分解。下面是我的代码,显然运行良好,但对于某些矩阵,与matlab中内置的[L,U,P]=lu(A)函数相比,它给出了不同的结果 function [L, U, P] = lu_decomposition_pivot(A) n = size(A,1); Ak = A; L = eye(n); U = zeros(n); P = eye(n); for k = 1:n-1 [~,r] = max(a
[L,U,P]=lu(A)
函数相比,它给出了不同的结果
function [L, U, P] = lu_decomposition_pivot(A)
n = size(A,1);
Ak = A;
L = eye(n);
U = zeros(n);
P = eye(n);
for k = 1:n-1
[~,r] = max(abs(Ak(k:end,k)));
r = n-(n-k+1)+r;
Ak([k r],:) = Ak([r k],:);
P([k r],:) = P([r k],:);
for i = k+1:n
L(i,k) = Ak(i,k) / Ak(k,k);
for j = 1:n
U(k,j) = Ak(k,j);
Ak(i,j) = Ak(i,j) - L(i,k)*Ak(k,j);
end
end
end
U(:,end) = Ak(:,end);
return
有人能看出哪里错了吗
function [L, U, P] = lu_decomposition_pivot(A)
n = size(A,1);
Ak = A;
L = zeros(n);
U = zeros(n);
P = eye(n);
for k = 1:n-1
for i = k+1:n
[~,r] = max(abs(Ak(:,k)));
Ak([k r],:) = Ak([r k],:);
P([k r],:) = P([r k],:);
L(i,k) = Ak(i,k) / Ak(k,k);
for j = k+1:n
U(k,j-1) = Ak(k,j-1);
Ak(i,j) = Ak(i,j) - L(i,k)*Ak(k,j);
end
end
end
L(1:n+1:end) = 1;
U(:,end) = Ak(:,end);
return
下面是我测试过的两个矩阵。第一个是正确的,而第二个有一些元素是颠倒的
A = [1 2 0; 2 4 8; 3 -1 2];
A = [0.8443 0.1707 0.3111;
0.1948 0.2277 0.9234;
0.2259 0.4357 0.4302];
更新
我已经检查了我的代码并纠正了一些错误,但仍然缺少部分旋转。在第一列中,最后两行始终是反向的(与matlab中lu()的结果相比)
我忘了,如果在矩阵p中有一个交换,我也必须交换矩阵L。所以只要在交换p之后添加下一行,一切都会很好地工作
L([k r],:) = L([r k],:);
我的答案是:
function [L, U, P] = LU_pivot(A)
[n, n1] = size(A); L=eye(n); P=eye(n); U=A;
for j = 1:n
[pivot m] = max(abs(U(j:n, j)));
m = m+j-1;
if m ~= j
U([m,j],:) = U([j,m], :); % interchange rows m and j in U
P([m,j],:) = P([j,m], :); % interchange rows m and j in P
if j >= 2; % very_important_point
L([m,j],1:j-1) = L([j,m], 1:j-1); % interchange rows m and j in columns 1:j-1 of L
end;
end
for i = j+1:n
L(i, j) = U(i, j) / U(j, j);
U(i, :) = U(i, :) - L(i, j)*U(j, :);
end
end
这两种功能都不正确。 这是正确的
function [L, U, P] = LU_pivot(A)
[m, n] = size(A); L=eye(n); P=eye(n); U=A;
for k=1:m-1
pivot=max(abs(U(k:m,k)))
for j=k:m
if(abs(U(j,k))==pivot)
ind=j
break;
end
end
U([k,ind],k:m)=U([ind,k],k:m)
L([k,ind],1:k-1)=L([ind,k],1:k-1)
P([k,ind],:)=P([ind,k],:)
for j=k+1:m
L(j,k)=U(j,k)/U(k,k)
U(j,k:m)=U(j,k:m)-L(j,k)*U(k,k:m)
end
pause;
end
end
你能具体说明这条线放在哪里吗?我测试了你的代码,发现L矩阵有问题,应该在
P([kr],:)=P([rkk],:)代码>