% ピボット選択型LU分解（メモリ節約型）
% n次の正方行列AのLU分解PA = LUを計算するピボット選択型アルゴリズム
% Lの計算結果を配列Aの下三角部（対角部を除く）に
% Uの計算結果を配列Aの上三角部に格納する．

A = [ 0, 50, 20; ...
      2,  1, 10; ...
     10,  0,  5 ];
n = 3;

row = 1:n;

for k = 1:n
    % ピボット選択
    [value,p] = max(abs(A(k:n,k)));
    p = p + (k-1);
    % ピボット選択に伴う行列AとLの更新
    A([k,p],1:n) = A([p,k],1:n);
    row([k,p]) = row([p,k]);    
    % 行列UとLの計算
    A(k+1:n,k) = A(k+1:n,k)/A(k,k);
    % 行列Aの更新
    A(k+1:n,k+1:n) = A(k+1:n,k+1:n) - A(k+1:n,k)*A(k,k+1:n);
end

% 置換行列Pの計算
P = zeros(n,n);
for k = 1:n
    P(k,row(k)) = 1;
end

A
P
