Замена фрагментов матриц Matlab - PullRequest
0 голосов
/ 28 мая 2020

Я написал программу, реализующую исключение Гаусса с полным поворотом:

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, поскольку я написал одно и то же с обеих сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...