Я написал программу, реализующую исключение Гаусса с полным поворотом:
function x = gecp(A,b)
x = b;
n = length(A);
p = 1:n;
l = b;
for k = 1:n
[i,j] = find(A(k:n,k:n)==max(abs(A(k:n,k:n)),[],'all'));
i = i+k-1;
j = j+k-1;
[A(k,:),A(i,:)] = deal(A(i,:),A(k,:));
[A(:,j),A(:,k)] = deal(A(:,k),A(:,j));
[b(i),b(k)] = deal(b(k),b(i));
[p(k),p(j)] = deal(p(j),p(k));
temp = (k+1):n;
l(temp) = A(temp,k)/A(k,k);
b(temp) = b(temp)-l(temp).*b(k);
A(temp,temp) = A(temp,temp)-l(temp).*A(k,temp);
end
x(n) = b(n)/A(n,n);
for k = (n-1):-1:1
s = 0;
for h = (k+1):n
s = s+A(k,h)*x(h);
end
x(k) = (b(k)-s)/A(k,k);
end
x(p) = x;
И называется она так:
N = 5; A = randn(N); b = randn(N,1); x = gecp(A,b)
К сожалению, все строки, содержащие функцию deal
(используются для меняя местами строки столбцов матриц), я получаю следующую (или аналогичную) ошибку: «Невозможно выполнить присвоение, потому что размер левой стороны составляет 1 на 5, а размер правой стороны - 0 на 5».
К сожалению, я понятия не имею, зачем менять ширину этих векторов на 0
, поскольку я написал одно и то же с обеих сторон.