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
Этот класс поддерживает механизм неразрушающего разложения .
| 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 |
|
| |
| 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 |
|
| |
| 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 |
|
| |
| typedef Eigen::Index | Index |
| Тип индексов. Подробнее... |
|
FullPivLU() [1/4]
| Eigen::FullPivLU< MatrixType >::FullPivLU |
Конструктор по умолчанию.
Конструктор по умолчанию полезен в случаях, когда пользователь намерен выполнить разложение через LU::compute(const MatrixType&).
FullPivLU() [2/4]
| Eigen::FullPivLU< MatrixType >::FullPivLU | ( | Index | rows, |
| Index | cols | ||
| ) |
Конструктор по умолчанию с предварительным выделением памяти.
Аналогичен конструктору по умолчанию, но с предварительным выделением внутренней памяти в соответствии с указанными размерами задачи.
- См. также
- FullPivLU()
FullPivLU() [3/4]
| explicit |
Конструктор.
- Параметры
-
matrix матрица, для которой требуется вычислить LU-разложение. Она должна быть ненулевой.
FullPivLU() [4/4]
| explicit |
Создает LU-факторизацию из заданной матрицы.
Этот перегруженный конструктор предоставляется для разложения на месте, когда MatrixType является Eigen::Ref.
- См. также
- FullPivLU(const EigenBase&)
compute()
| inline |
Вычисляет LU-разложение заданной матрицы.
- Параметры
-
matrix матрица, для которой требуется вычислить LU-разложение. Она должна быть ненулевой.
- Возвращает
- ссылку на *this
determinant()
| internal::traits< MatrixType >::Scalar Eigen::FullPivLU< MatrixType >::determinant |
- Возвращает
- определитель матрицы, для которой *this является LU-разложением. Он имеет только линейную сложность (т. е. O(n), где n — размер квадратной матрицы), так как LU-разложение уже вычислено.
- Примечание
- Это только для квадратных матриц.
- Для матриц фиксированного размера до размера 4, MatrixBase::determinant() предлагает оптимизированные пути.
- Предупреждение
- определитель может быть очень большим или очень маленьким, поэтому для матриц достаточно большого размера существует риск переполнения/потери точности.
- См. также
- MatrixBase::determinant()
dimensionOfKernel()
| inline |
- Возвращает
- размер ядра матрицы, для которой *this является LU-разложением.
- Примечание
- Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).
image()
| 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()
| inline |
- Возвращает
- обратную матрицу, для которой *this является LU-разложением.
- Примечание
- Если эта матрица не обратима, возвращаемая матрица имеет неопределённые коэффициенты. Сначала используйте isInvertible(), чтобы определить, обратима ли эта матрица.
- См. также
- MatrixBase::inverse()
isInjective()
| inline |
- Возвращает
- true, если матрица, для которой *this является LU-разложением, представляет инъективное линейное отображение, т. е. имеет тривиальное ядро; в противном случае false.
- Примечание
- Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).
isInvertible()
| inline |
- Возвращает
- true, если матрица, для которой *this является LU-разложением, обратима.
- Примечание
- Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).
isSurjective()
| inline |
- Возвращает
- true, если матрица, для которой *this является LU-разложением, представляет сюръективное линейное отображение; в противном случае false.
- Примечание
- Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого он использует пороговое значение, которое можно контролировать, вызывая setThreshold(const RealScalar&).
kernel()
| 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()
| inline |
- Возвращает
- матрицу LU-разложения: верхняя треугольная часть — U, единичная нижняя треугольная часть — L (по крайней мере, для квадратных матриц; в случае неквадратных матриц необходима особая обработка, см. документацию класса FullPivLU).
- См. также
- matrixL(), matrixU()
maxPivot()
| inline |
- Возвращает
- модуль наибольшего главного элемента, т.е. наибольшего диагонального элемента U.
nonzeroPivots()
| inline |
- Возвращает
- количество ненулевых главных элементов в LU-разложении. Здесь «ненулевой» понимается в точном смысле, а не в приближенном. Хотя это понятие само по себе не является особо интересным, но оно всё же полезно при реализации алгоритмов.
- См. также
- rank()
permutationP()
| inline |
- Возвращает
- матрицу перестановок P
- См. также
- permutationQ()
permutationQ()
| inline |
- Возвращает
- матрицу перестановок Q
- См. также
- permutationP()
rank()
| inline |
- Возвращает
- ранг матрицы, LU-разложением которой является *this.
- Примечание
- Этот метод должен определить, какие главные элементы следует считать ненулевыми. Для этого используется порог, который можно контролировать, вызывая setThreshold(const RealScalar&).
rcond()
| inline |
- Возвращает
- оценку обратной величины числа обусловленности матрицы, LU-разложением которой является
*this.
reconstructedMatrix()
| MatrixType Eigen::FullPivLU< MatrixType >::reconstructedMatrix |
- Возвращает
- матрицу, представленную разложением, т.е. возвращает произведение: \( P^{-1} L U Q^{-1} \). Эта функция предназначена для отладки.
setThreshold() [1/2]
| 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]
| inline |
Позволяет вернуться к поведению по умолчанию, позволяя Eigen использовать свою стандартную формулу для определения порога.
Здесь необходимо передать специальный объект Eigen::Default.
lu.setThreshold(Eigen::Default);
См. документацию по setThreshold(const RealScalar&).
solve()
| 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
threshold()
| inline |
Возвращает порог, который будет использоваться определёнными методами, такими как rank().
См. документацию по setThreshold(const RealScalar&).
The documentation for this class was generated from the following file:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1FullPivLU.html