Spec-Zone.ru › Eigen3

Eigen::FullPivLU

шаблон<typename _MatrixType>
класс Eigen::FullPivLU< _MatrixType >

LU-разложение матрицы с полным выбором поворотов и связанные функции.

Параметры шаблона
_MatrixType тип матрицы, для которой вычисляется LU-разложение

Этот класс представляет LU-разложение любой матрицы с полным выбором поворотов: матрица A разлагается как \( A = P^{-1} L U Q^{-1} \), где L — единично-нижнетреугольная, U — верхнетреугольная, а P и Q — матрицы перестановок. Это разложение LU, позволяющее определить ранг. Собственные значения (диагональные коэффициенты) U упорядочены таким образом, что любые нули находятся в конце.

Это разложение позволяет решать системы линейных уравнений, вычислять ранг, определимость, обратную матрицу, ядро и определитель.

Это LU-разложение очень стабильно и хорошо протестировано для больших матриц. Однако в некоторых случаях разложение по сингулярным значениям (SVD) по своей природе более стабильно и/или гибко. Например, при вычислении ядра матрицы использование SVD позволяет выбрать наименьшие сингулярные значения матрицы, чего разложение LU не видит.

Данные LU-разложения можно получить напрямую через методы matrixLU(), permutationP(), permutationQ().

В качестве примера, вот как можно получить исходную матрицу:

typedef Matrix<double, 5, 3> Matrix5x3;
typedef Matrix<double, 5, 5> Matrix5x5;
Matrix5x3 m = Matrix5x3::Random();
cout << "Here is the matrix m:" << endl << m << endl;
Eigen::FullPivLU<Matrix5x3> lu(m);
cout << "Here is, up to permutations, its LU decomposition matrix:"
     << endl << lu.matrixLU() << endl;
cout << "Here is the L part:" << endl;
Matrix5x5 l = Matrix5x5::Identity();
l.block<5,3>(0,0).triangularView<StrictlyLower>() = lu.matrixLU();
cout << l << endl;
cout << "Here is the U part:" << endl;
Matrix5x3 u = lu.matrixLU().triangularView<Upper>();
cout << u << endl;
cout << "Let us now reconstruct the original matrix m:" << endl;
cout << lu.permutationP().inverse() * l * u * lu.permutationQ().inverse() << endl;

Вывод:

Here is the matrix m:
   0.68  -0.605 -0.0452
 -0.211   -0.33   0.258
  0.566   0.536   -0.27
  0.597  -0.444  0.0268
  0.823   0.108   0.904
Here is, up to permutations, its LU decomposition matrix:
 0.904  0.823  0.108
-0.299  0.812  0.569
 -0.05  0.888   -1.1
0.0296  0.705  0.768
 0.285 -0.549 0.0436
Here is the L part:
     1      0      0      0      0
-0.299      1      0      0      0
 -0.05  0.888      1      0      0
0.0296  0.705  0.768      1      0
 0.285 -0.549 0.0436      0      1
Here is the U part:
0.904 0.823 0.108
    0 0.812 0.569
    0     0  -1.1
    0     0     0
    0     0     0
Let us now reconstruct the original matrix m:
   0.68  -0.605 -0.0452
 -0.211   -0.33   0.258
  0.566   0.536   -0.27
  0.597  -0.444  0.0268
  0.823   0.108   0.904

Этот класс поддерживает механизм неразрушающего разложения .

См. также
MatrixBase::fullPivLu(), MatrixBase::determinant(), MatrixBase::inverse()
Inheritance graph
template<typename InputType >
FullPivLU & compute (const EigenBase< InputType > &matrix)
internal::traits< MatrixType >::Scalar determinant () const
Index dimensionOfKernel () const
FullPivLU ()
Конструктор по умолчанию. Подробнее...
template<typename InputType >
FullPivLU (const EigenBase< InputType > &matrix)
template<typename InputType >
FullPivLU (EigenBase< InputType > &matrix)
Создаёт LU-разложение из заданной матрицы. Подробнее...
FullPivLU (Index rows, Index cols)
Конструктор по умолчанию с предварительной выделением памяти. Подробнее...
const internal::image_retval< FullPivLU > image (const MatrixType &originalMatrix) const
const Inverse< FullPivLU > inverse () const
bool isInjective () const
bool isInvertible () const
bool isSurjective () const
const internal::kernel_retval< FullPivLU > kernel () const
const MatrixType & matrixLU () const
RealScalar maxPivot () const
Index nonzeroPivots () const
const PermutationPType & permutationP () const
const PermutationQType & permutationQ () const
Index rank () const
RealScalar rcond () const
MatrixType reconstructedMatrix () const
FullPivLU & setThreshold (const RealScalar &threshold)
FullPivLU & setThreshold (Default_t)
template<typename Rhs >
const Solve< FullPivLU, Rhs > solve (const MatrixBase< Rhs > &b) const
RealScalar threshold () const
- Public Member Functions inherited from Eigen::SolverBase< FullPivLU< _MatrixType > >
AdjointReturnType adjoint () const
FullPivLU< _MatrixType > & derived ()
const FullPivLU< _MatrixType > & derived () const
const Solve< FullPivLU< _MatrixType >, Rhs > solve (const MatrixBase< Rhs > &b) const
SolverBase ()
ConstTransposeReturnType transpose () const
- Public Member Functions inherited from Eigen::EigenBase< Derived >
EIGEN_CONSTEXPR Index cols () const EIGEN_NOEXCEPT
Derived & derived ()
const Derived & derived () const
EIGEN_CONSTEXPR Index rows () const EIGEN_NOEXCEPT
EIGEN_CONSTEXPR Index size () const EIGEN_NOEXCEPT
- Public Types inherited from Eigen::EigenBase< Derived >
typedef Eigen::Index Index
Тип индексов. Подробнее...

FullPivLU() [1/4]

template<typename MatrixType >
Eigen::FullPivLU< MatrixType >::FullPivLU

Конструктор по умолчанию.

Конструктор по умолчанию полезен в случаях, когда пользователь намерен выполнить разложение через LU::compute(const MatrixType&).

FullPivLU() [2/4]

template<typename MatrixType >
Eigen::FullPivLU< MatrixType >::FullPivLU ( Index rows,
Index cols
)

Конструктор по умолчанию с предварительным выделением памяти.

Аналогичен конструктору по умолчанию, но с предварительным выделением внутренней памяти в соответствии с указанными размерами задачи.

См. также
FullPivLU()

FullPivLU() [3/4]

template<typename MatrixType >
template<typename InputType >
Eigen::FullPivLU< MatrixType >::FullPivLU ( const EigenBase< InputType > & matrix )
explicit

Конструктор.

Параметры
matrix матрица, для которой требуется вычислить LU-разложение. Она должна быть ненулевой.

FullPivLU() [4/4]

template<typename MatrixType >
template<typename InputType >
Eigen::FullPivLU< MatrixType >::FullPivLU ( EigenBase< InputType > & matrix )
explicit

Создает LU-факторизацию из заданной матрицы.

Этот перегруженный конструктор предоставляется для разложения на месте, когда MatrixType является Eigen::Ref.

См. также
FullPivLU(const EigenBase&)

compute()

template<typename _MatrixType >
template<typename InputType >
FullPivLU& Eigen::FullPivLU< _MatrixType >::compute ( const EigenBase< InputType > & matrix )
inline

Вычисляет LU-разложение заданной матрицы.

Параметры
matrix матрица, для которой требуется вычислить LU-разложение. Она должна быть ненулевой.
Возвращает
ссылку на *this

determinant()

template<typename MatrixType >
internal::traits< MatrixType >::Scalar Eigen::FullPivLU< MatrixType >::determinant
Возвращает
определитель матрицы, для которой *this является LU-разложением. Он имеет только линейную сложность (т. е. O(n), где n — размер квадратной матрицы), так как LU-разложение уже вычислено.
Примечание
Это только для квадратных матриц.
Для матриц фиксированного размера до размера 4, MatrixBase::determinant() предлагает оптимизированные пути.
Предупреждение
определитель может быть очень большим или очень маленьким, поэтому для матриц достаточно большого размера существует риск переполнения/потери точности.
См. также
MatrixBase::determinant()

dimensionOfKernel()

template<typename _MatrixType >
Index Eigen::FullPivLU< _MatrixType >::dimensionOfKernel ( ) const
inline
Возвращает
размер ядра матрицы, для которой *this является LU-разложением.
Примечание
Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).

image()

template<typename _MatrixType >
const internal::image_retval<FullPivLU> Eigen::FullPivLU< _MatrixType >::image ( const MatrixType & originalMatrix ) const
inline
Возвращает
образ матрицы, также называемый её пространством столбцов. Столбцы возвращаемой матрицы образуют базис образа (пространства столбцов).
Параметры
originalMatrix исходная матрица, для которой *this является LU-разложением. Причина, по которой она должна быть передана сюда, заключается в том, что это позволяет значительную оптимизацию, так как в противном случае этому методу нужно будет восстановить её из LU-разложения.
Примечание
Если размер образа равен нулю, то возвращаемая матрица является столбцовым вектором, заполненным нулями.
Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).

Пример:

Matrix3d m;
m << 1,1,0,
     1,3,2,
     0,1,1;
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Notice that the middle column is the sum of the two others, so the "
     << "columns are linearly dependent." << endl;
cout << "Here is a matrix whose columns have the same span but are linearly independent:"
     << endl << m.fullPivLu().image(m) << endl;

Вывод:

Here is the matrix m:
1 1 0
1 3 2
0 1 1
Notice that the middle column is the sum of the two others, so the columns are linearly dependent.
Here is a matrix whose columns have the same span but are linearly independent:
1 1
3 1
1 0
См. также
kernel()

inverse()

template<typename _MatrixType >
const Inverse<FullPivLU> Eigen::FullPivLU< _MatrixType >::inverse ( ) const
inline
Возвращает
обратную матрицу, для которой *this является LU-разложением.
Примечание
Если эта матрица не обратима, возвращаемая матрица имеет неопределённые коэффициенты. Сначала используйте isInvertible(), чтобы определить, обратима ли эта матрица.
См. также
MatrixBase::inverse()

isInjective()

template<typename _MatrixType >
bool Eigen::FullPivLU< _MatrixType >::isInjective ( ) const
inline
Возвращает
true, если матрица, для которой *this является LU-разложением, представляет инъективное линейное отображение, т. е. имеет тривиальное ядро; в противном случае false.
Примечание
Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).

isInvertible()

template<typename _MatrixType >
bool Eigen::FullPivLU< _MatrixType >::isInvertible ( ) const
inline
Возвращает
true, если матрица, для которой *this является LU-разложением, обратима.
Примечание
Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).

isSurjective()

template<typename _MatrixType >
bool Eigen::FullPivLU< _MatrixType >::isSurjective ( ) const
inline
Возвращает
true, если матрица, для которой *this является LU-разложением, представляет сюръективное линейное отображение; в противном случае false.
Примечание
Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).

kernel()

template<typename _MatrixType >
const internal::kernel_retval<FullPivLU> Eigen::FullPivLU< _MatrixType >::kernel ( ) const
inline
Возвращает
ядро матрицы, также называемое её пространством нулевых векторов. Столбцы возвращаемой матрицы образуют базис ядра.
Примечание
Если размерность ядра равна нулю, то возвращаемая матрица представляет собой столбец нулей.
Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого используется порог, который можно контролировать, вызывая setThreshold(const RealScalar&).

Пример:

MatrixXf m = MatrixXf::Random(3,5);
cout << "Here is the matrix m:" << endl << m << endl;
MatrixXf ker = m.fullPivLu().kernel();
cout << "Here is a matrix whose columns form a basis of the kernel of m:"
     << endl << ker << endl;
cout << "By definition of the kernel, m*ker is zero:"
     << endl << m*ker << endl;

Вывод:

Here is the matrix m:
   0.68   0.597   -0.33   0.108   -0.27
 -0.211   0.823   0.536 -0.0452  0.0268
  0.566  -0.605  -0.444   0.258   0.904
Here is a matrix whose columns form a basis of the kernel of m:
 -0.219   0.763
0.00335  -0.447
      0       1
      1       0
 -0.145  -0.285
By definition of the kernel, m*ker is zero:
 7.45e-09  1.49e-08
-1.86e-09 -4.05e-08
        0 -2.98e-08
См. также
image()

matrixLU()

template<typename _MatrixType >
const MatrixType& Eigen::FullPivLU< _MatrixType >::matrixLU ( ) const
inline
Возвращает
матрицу LU-разложения: верхняя треугольная часть — U, единичная нижняя треугольная часть — L (по крайней мере, для квадратных матриц; в случае неквадратных матриц необходима особая обработка, см. документацию класса FullPivLU).
См. также
matrixL(), matrixU()

maxPivot()

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::maxPivot ( ) const
inline
Возвращает
модуль наибольшего главного элемента, т.е. наибольшего диагонального элемента U.

nonzeroPivots()

template<typename _MatrixType >
Index Eigen::FullPivLU< _MatrixType >::nonzeroPivots ( ) const
inline
Возвращает
количество ненулевых главных элементов в LU-разложении. Здесь «ненулевой» понимается в точном смысле, а не в приближенном. Хотя это понятие само по себе не является особо интересным, но оно всё же полезно при реализации алгоритмов.
См. также
rank()

permutationP()

template<typename _MatrixType >
const PermutationPType& Eigen::FullPivLU< _MatrixType >::permutationP ( ) const
inline
Возвращает
матрицу перестановок P
См. также
permutationQ()

permutationQ()

template<typename _MatrixType >
const PermutationQType& Eigen::FullPivLU< _MatrixType >::permutationQ ( ) const
inline
Возвращает
матрицу перестановок Q
См. также
permutationP()

rank()

template<typename _MatrixType >
Index Eigen::FullPivLU< _MatrixType >::rank ( ) const
inline
Возвращает
ранг матрицы, LU-разложением которой является *this.
Примечание
Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого используется порог, который можно контролировать, вызывая setThreshold(const RealScalar&).

rcond()

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::rcond ( ) const
inline
Возвращает
оценку обратной величины числа обусловленности матрицы, LU-разложением которой является *this.

reconstructedMatrix()

template<typename MatrixType >
MatrixType Eigen::FullPivLU< MatrixType >::reconstructedMatrix
Возвращает
матрицу, представленную разложением, т.е. возвращает произведение: \( P^{-1} L U Q^{-1} \). Эта функция предназначена для отладки.

setThreshold() [1/2]

template<typename _MatrixType >
FullPivLU& Eigen::FullPivLU< _MatrixType >::setThreshold ( const RealScalar & threshold )
inline

Позволяет задать порог, используемый некоторыми методами, такими как rank(), которые должны определить, когда главные элементы считаются ненулевыми. Это не используется для самого LU-разложения.

Когда ему требуется получить значение порога, Eigen вызывает threshold(). По умолчанию это делается по формуле, автоматически определяющей разумный порог. После вызова данного метода setThreshold(const RealScalar&), используется ваше значение.

Параметры
threshold Новое значение, используемое в качестве порога.

Главный элемент считается ненулевым, если его абсолютное значение строго больше \( \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \), где maxpivot — наибольший главный элемент.

Если вы хотите вернуться к поведению по умолчанию, вызовите setThreshold(Default_t)

setThreshold() [2/2]

template<typename _MatrixType >
FullPivLU& Eigen::FullPivLU< _MatrixType >::setThreshold ( Default_t )
inline

Позволяет вернуться к поведению по умолчанию, позволяя Eigen использовать свою стандартную формулу для определения порога.

Здесь необходимо передать специальный объект Eigen::Default.

lu.setThreshold(Eigen::Default); 

См. документацию по setThreshold(const RealScalar&).

solve()

template<typename _MatrixType >
template<typename Rhs >
const Solve<FullPivLU, Rhs> Eigen::FullPivLU< _MatrixType >::solve ( const MatrixBase< Rhs > & b ) const
inline
Возвращает
решение x к уравнению Ax=b, где A — матрица, LU-разложением которой является *this.
Параметры
b правая часть уравнения, которое нужно решить. Может быть вектором или матрицей; единственное требование, чтобы уравнение имело смысл, состоит в том, что b.rows()==A.rows(), где A — матрица, LU-разложением которой является *this.
Возвращает
решение.

Этот метод просто пытается найти наилучшее возможное решение. Если вы хотите проверить, существует ли решение или оно является точным, просто вызовите эту функцию для получения результата, а затем вычислите ошибку этого результата или используйте MatrixBase::isApprox() напрямую, например, так:

bool a_solution_exists = (A*result).isApprox(b, precision); 

Этот метод избегает деления на ноль, поэтому отсутствие решения само по себе не означает, что вы получите inf или nan значения.

Если существует более одного решения, этот метод произвольно выберет одно. Если вам нужна полная аналитика пространства решений, возьмите единственное решение, полученное этим методом, и добавьте к нему элементы ядра, как определено в kernel().

Пример:

Matrix<float,2,3> m = Matrix<float,2,3>::Random();
Matrix2f y = Matrix2f::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is the matrix y:" << endl << y << endl;
Matrix<float,3,2> x = m.fullPivLu().solve(y);
if((m*x).isApprox(y))
{
  cout << "Here is a solution x to the equation mx=y:" << endl << x << endl;
}
else
  cout << "The equation mx=y does not have any solution." << endl;

Вывод:

Here is the matrix m:
  0.68  0.566  0.823
-0.211  0.597 -0.605
Here is the matrix y:
 -0.33 -0.444
 0.536  0.108
Here is a solution x to the equation mx=y:
     0      0
 0.291 -0.216
  -0.6 -0.391
См. также
TriangularView::solve(), kernel(), inverse()

threshold()

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::threshold ( ) const
inline

Возвращает порог, который будет использоваться определёнными методами, такими как rank().

См. документацию по setThreshold(const RealScalar&).


The documentation for this class was generated from the following file:
  • FullPivLU.h

© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1FullPivLU.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API