Факторинг матриц в элементарные матрицы - PullRequest
3 голосов
/ 03 августа 2010

Есть ли в MATLAB, Maple или Mathematica пакет, который делает это?

Ответы [ 3 ]

5 голосов
/ 06 августа 2010

Я предполагаю, что под "элементарными" матрицами вы подразумеваете только те, которые выполняют элементарные операции перестановки строк, умножения строк и сложения строк.

Возможно, вам будет интересно узнать, что является частью результата разложения PLU (факторизации). U, возникающий из разложения PLU, является результатом исключения Гаусса, и это разложение PLU является просто замаскированной GE. И P и L разложения PLU кодируют элементарные операции, выполняемые для выполнения GE. И у всех Maple, Matlab и Mathematica есть хорошая процедура разложения PLU. Таким образом, вы можете получить элементарные факторы.

Давайте пока предположим, что нам не нужно делать никаких перестановок строк. Таким образом, учитывая матрицу M, мы можем получить нижнюю треугольную L и верхнюю треугольную M. Элементы L, лежащие ниже главной диагонали, являются значениями, с помощью которых можно построить матрицы сложения элементарных строк.

В конце кода Maple, чтобы показать, как это можно сделать. Там производится три набора элементарных матриц. Первый набор, в таблице T1, обусловлен шагами GE, приводящими к тому, что M переводит форму эшелона в ряд, и исходят из использования l1 L разложения PLU M. Это нижний треугольник. Далее мы транспонируем u1, U разложения PLU M, чтобы иметь дело с верхним треугольником M.

Второй набор элементарных матриц сложения строк в таблице T2 обусловлен шагами GE получения u1 ^% T (транспонирование U из разложения M PLU) в форму эшелона строк. Они построены с использованием записей в l2 L разложения PLU на u1 ^% T.

Это просто оставляет u2 U разложения PLU на u1 ^% T. Это диагональная матрица (если не было перестановок строк). Таким образом, мы строим матрицы масштабирования элементарных строк для каждой строки u2.

Наконец, мы можем затем расположить все в правильном порядке и умножить их вместе. Обратите внимание, что матрицы T2 появляются в обратном порядке, транспонированы, потому что они должны умножиться вместе, чтобы сформировать u1 ^% T. Точно так же T3 появляются между наборами T1 и T2, так как конструкция T3 u2.

Как позднее отредактировать, здесь это как процедура Maple. Теперь он генерирует матрицы перестановки строк из результатов перестановки. И это не возвращает некоторых ненужных факторов, которые оказываются только личностью.

Обратите внимание, что это для точных матриц, а не матриц с плавающей запятой (для которых пробег может варьироваться в зависимости от того, как опорные точки выбираются по величине и как он выполняет сравнения).

ElemDecomp:=proc(M::Matrix(square))
local p1,u1,i,j,T1,T2,T3,p2,m,n,lu1,lu2,P1,P2;
uses LinearAlgebra;
  (m,n):=Dimensions(M);
  p1,lu1:=LUDecomposition(M,output=[':-NAG']);
  for i from 1 to m-1 do
    for j from 1 to i do
      if lu1[i+1,j]<>0 then
        T1[i*j]:=IdentityMatrix(m,compact=false);
        T1[i*j][i+1,j]:=lu1[i+1,j];
      end if;
  end do; end do;
  for i from 1 to m do
    if p1[i]<>i then
      P1[i]:=IdentityMatrix(m,compact=false);
      P1[i][p1[i],i],P1[i][i,p1[i]]:=1,1;
      P1[i][p1[i],p1[i]],P1[i][i,i]:=0,0;
    end if;
  end do;
  u1:=Matrix(lu1,shape=triangular[upper]);
  p2,lu2:=LUDecomposition(u1^%T,output=[':-NAG']);
  for i from 1 to m-1 do
    for j from 1 to i do
      if lu2[i+1,j]<>0 then
        T2[i*j]:=IdentityMatrix(m,compact=false);
        T2[i*j][i+1,j]:=lu2[i+1,j];
      end if;
  end do; end do;
  for i from 1 to m do
    if lu2[i,i]<>1 then
      T3[i]:=IdentityMatrix(m,compact=false);
      T3[i][i,i]:=lu2[i,i];
    end if;
  end do;
  for i from 1 to m do
    if p2[i]<>i then
      P2[i]:=IdentityMatrix(m,compact=false);
      P2[i][p2[i],i],P2[i][i,p2[i]]:=1,1;
      P2[i][p2[i],p2[i]],P2[i][i,i]:=0,0;
    end if;
  end do;
  `if`(type(P1,table),entries(P1,':-nolist'),NULL),
  seq(seq(`if`(assigned(T1[i*j]),T1[i*j],NULL),j=1..i),i=1..m-1),
  seq(`if`(assigned(T3[i]),T3[i],NULL),i=1..min(m,n)),
  seq(seq(`if`(assigned(T2[i*j]),T2[i*j]^%T,NULL),j=i..1,-1),i=m-1..1,-1),
  `if`(type(P2,table),entries(P2,':-nolist'),NULL);
end proc:

A:=LinearAlgebra:-RandomMatrix(3,generator=1..4);

ElemDecomp(A);

LinearAlgebra:-Norm( `.`(%) - A);
2 голосов
/ 06 августа 2010

Страница Разложение матриц в документации Mathematica перечисляет все встроенные функции разложения матриц, такие как SingularValueDecomposition, LUDecomposition, CholeskyDecomposition, SchurDecomposition и т. Д.

HTH!

2 голосов
/ 03 августа 2010

В MATLAB имеется ряд функций факторизации / декомпозиции (см. Списки здесь в разделе «Собственные значения и сингулярные значения» и «Разложение матрицы»), например, Факторизация LU , ортогонально-треугольная декомпозиция и блок LDL 'факторизация и многие другие.

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