LUP

行順列のみのLU分解を参照する、部分ピボットによるLUP因数分解:PA=LU。

bool  LUP(
  matrix&  L,    // 下三角行列
  matrix&  U,    // 上三角行列
  matrix&  P      // 順列行列
  );

パラメータ

L key

[out] 下三角行列

U

[out] 上三角行列

P

[out] 順列行列

戻り値

成功の場合はtrue、それ以外の場合はfalse

  matrix matrix_a={{1,2,3,4},
                   {5,2,6,7},
                   {8,9,3,10},
                   {11,12,14,4}};
  matrix matrix_l,matrix_u,matrix_p;
//--- LUP分解
  matrix_a.LUP(matrix_l,matrix_u,matrix_p);
  Print("matrix_l\n",matrix_l);
  Print("matrix_u\n",matrix_u);
  Print("matrix_p\n",matrix_p);
//--- P * A = L * Uかどうかを確認する
  Print("P * A\n",matrix_p.MatMul(matrix_a));
  Print("L * U\n",matrix_l.MatMul(matrix_u));
 
  /*
  matrix_l
  [[1,0,0,0]
   [0.4545454545454545,1,0,0]
   [0.7272727272727273,-0.07894736842105282,1,0]
   [0.09090909090909091,-0.2631578947368421,-0.2262773722627738,1]]
  matrix_u
  [[11,12,14,4]
   [0,-3.454545454545454,-0.3636363636363633,5.181818181818182]
   [0,0,-7.210526315789473,7.500000000000001]
   [0,0,0,6.697080291970803]]
  matrix_p
  [[0,0,0,1]
   [0,1,0,0]
   [0,0,1,0]
   [1,0,0,0]]
  P * A
  [[11,12,14,4]
   [5,2,6,7]
   [8,9,3,10]
   [1,2,3,4]]
  L * U
  [[11,12,14,4]
   [5,2,6,7]
   [8,9,3.000000000000001,10]
   [1,2,3,4]]
  */

LU
QR