Eigen::JacobiSVD
template<typename _MatrixType, int QRPreconditioner>
class Eigen::JacobiSVD< _MatrixType, QRPreconditioner >
Двустороннее разложение Якоби SVD прямоугольной матрицы.
- Параметры шаблона
-
_MatrixType тип матрицы, для которой вычисляется разложение SVD QRPreconditioner Этот необязательный параметр позволяет указать тип QR-разложения, который будет использоваться внутри для шага R-SVD для неквадратных матриц. См. обсуждение возможных значений ниже.
Разложение SVD заключается в разложении любой n×p матрицы A как произведения
\[ A = U S V^* \]
где U — унитарная n×n, V — унитарная p×p, и S — действительная положительная n×p матрица, которая равна нулю вне главной диагонали; диагональные элементы S известны как сингулярные значения A, а столбцы U и V известны как левые и правые сингулярные векторы A соответственно.
Сингулярные значения всегда отсортированы в порядке убывания.
Это разложение JacobiSVD по умолчанию вычисляет только сингулярные значения. Если вам нужны U или V, вам нужно запросить их явно.
Вы можете запросить вычисление только усечённого U или V, что означает следующее. В случае прямоугольной n×p матрицы, пусть m — меньшее значение из n и p, тогда существует только m сингулярных векторов; оставшиеся столбцы U и V не соответствуют фактическим сингулярным векторам. Запрос усечённого U или V означает запрос только их первых m столбцов. Таким образом, U — это n×m матрица, а V — p×m матрица. Обратите внимание, что усечённые U и V — всё, что вам нужно для решения (методом наименьших квадратов).
Вот пример, демонстрирующий базовое использование:
MatrixXf m = MatrixXf::Random(3,2); cout << "Here is the matrix m:" << endl << m << endl; JacobiSVD<MatrixXf> svd(m, ComputeThinU | ComputeThinV); cout << "Its singular values are:" << endl << svd.singularValues() << endl; cout << "Its left singular vectors are the columns of the thin U matrix:" << endl << svd.matrixU() << endl; cout << "Its right singular vectors are the columns of the thin V matrix:" << endl << svd.matrixV() << endl; Vector3f rhs(1, 0, 0); cout << "Now consider this rhs vector:" << endl << rhs << endl; cout << "A least-squares solution of m*x = rhs is:" << endl << svd.solve(rhs) << endl;
Вывод:
Here is the matrix m: 0.68 0.597 -0.211 0.823 0.566 -0.605 Its singular values are: 1.19 0.899 Its left singular vectors are the columns of the thin U matrix: 0.388 0.866 0.712 -0.0634 -0.586 0.496 Its right singular vectors are the columns of the thin V matrix: -0.183 0.983 0.983 0.183 Now consider this rhs vector: 1 0 0 A least-squares solution of m*x = rhs is: 0.888 0.496
Этот класс JacobiSVD представляет собой двустороннее разложение Якоби R-SVD, обеспечивающее оптимальную надёжность и точность. Недостаток заключается в том, что оно медленнее, чем алгоритмы SVD с бидиагонализацией для больших квадратных матриц; однако его сложность по-прежнему \( O(n^2p) \), где n — меньшая размерность, а p — большая размерность, что означает, что оно имеет тот же порядок сложности, что и более быстрые алгоритмы R-SVD с бидиагонализацией. В частности, как и любое R-SVD, оно использует неквадратность, в результате чего его сложность линейно зависит только от большей размерности.
Если входная матрица имеет коэффициенты inf или nan, результат вычисления не определён, но вычисление гарантированно завершится за конечное (и разумное) время.
Возможные значения для QRPreconditioner:
- ColPivHouseholderQRPreconditioner — по умолчанию. На практике он очень надёжен. Он использует QR с выбором столбцов.
- FullPivHouseholderQRPreconditioner — самый надёжный и самый медленный. Он использует полный выбор столбцов в QR. В отличие от других QR, он не позволяет вычислять усечённые унитарные матрицы.
- HouseholderQRPreconditioner — самый быстрый, но менее надёжный и точный, чем варианты с выбором столбцов. Он использует QR без выбора столбцов. Это очень похоже по надёжности и точности на процесс бидиагонализации, используемый алгоритмами SVD с бидиагонализацией (поскольку бидиагонализация по своей природе не использует выбор столбцов). Однако полученное разложение SVD всё ещё более надёжно, чем SVD с бидиагонализацией, потому что процесс итераций Якоби более надёжен, чем оптимизированные итерации SVD с бидиагонализацией.
- NoQRPreconditioner — вообще не использовать QR-предварительную обработку. Это полезно, если вы знаете, что будете вычислять разложения JacobiSVD только для квадратных матриц. Для неквадратных матриц необходима QR-предварительная обработка. Использование этого варианта ускорит компиляцию и уменьшит размер исполняемого файла. Это не значительно ускорит вычисления, так как JacobiSVD всегда проверяет, нужна ли QR-предварительная обработка, прежде чем применять её.
- См. также
- MatrixBase::jacobiSvd()
| EIGEN_CONSTEXPR Index | cols () const EIGEN_NOEXCEPT |
| JacobiSVD & | compute (const MatrixType &matrix) |
| Метод, выполняющий разложение заданной матрицы с использованием текущих опций. Подробнее... |
|
| JacobiSVD & | compute (const MatrixType &matrix, unsigned int computationOptions) |
| Метод, выполняющий разложение заданной матрицы с использованием пользовательских опций. Подробнее... |
|
| JacobiSVD () | |
| Конструктор по умолчанию. Подробнее... |
|
| JacobiSVD (const MatrixType &matrix, unsigned int computationOptions=0) | |
| Конструктор, выполняющий разложение заданной матрицы. Подробнее... |
|
| JacobiSVD (Index rows, Index cols, unsigned int computationOptions=0) | |
| Конструктор по умолчанию с предварительным выделением памяти. Подробнее... |
|
| EIGEN_CONSTEXPR Index | rows () const EIGEN_NOEXCEPT |
|
| |
| bool | computeU () const |
| bool | computeV () const |
| ComputationInfo | info () const |
| Сообщает, был ли успешен предыдущий расчёт. Подробнее... |
|
| const MatrixUType & | matrixU () const |
| const MatrixVType & | matrixV () const |
| Index | nonzeroSingularValues () const |
| Index | rank () const |
| JacobiSVD< _MatrixType, QRPreconditioner > & | setThreshold (const RealScalar &threshold) |
| JacobiSVD< _MatrixType, QRPreconditioner > & | setThreshold (Default_t) |
| const SingularValuesType & | singularValues () const |
| const Solve< JacobiSVD< _MatrixType, QRPreconditioner >, Rhs > | solve (const MatrixBase< Rhs > &b) const |
| RealScalar | threshold () const |
|
| |
| AdjointReturnType | adjoint () const |
| Derived & | derived () |
| const Derived & | derived () const |
| template<typename Rhs > | |
| const Solve< Derived, 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 |
|
| |
| typedef Eigen::Index | Index |
| Тип индексов. Подробнее... |
|
|
| |
| SVDBase () | |
| Конструктор по умолчанию. Подробнее... |
|
JacobiSVD() [1/3]
| inline |
Конструктор по умолчанию.
Конструктор по умолчанию полезен в случаях, когда пользователь намерен выполнить разложения с помощью JacobiSVD::compute(const MatrixType&).
JacobiSVD() [2/3]
| inline |
Конструктор по умолчанию с предварительным выделением памяти.
Аналогичен конструктору по умолчанию, но с предварительным выделением внутренней памяти в соответствии с указанными размерами задачи.
- См. также
- JacobiSVD()
JacobiSVD() [3/3]
| inlineexplicit |
Конструктор, выполняющий разложение заданной матрицы.
- Параметры
-
matrix матрица для разложения computationOptions необязательный параметр, позволяющий указать, хотите ли вы вычислить полные или тонкие унитарные матрицы U или V. По умолчанию они не вычисляются. Это битовое поле, возможные биты: ComputeFullU, ComputeThinU, ComputeFullV, ComputeThinV.
Тонкие унитарные матрицы доступны только если у вашего типа матрицы количество столбцов динамическое (например, MatrixXf). Они также недоступны с (непосредственным) FullPivHouseholderQR предварительным процессором.
cols()
| inline |
- Возвращает
- количество столбцов.
- См. также
- rows(), ColsAtCompileTime
compute() [1/2]
| inline |
Метод, выполняющий разложение заданной матрицы с использованием текущих параметров.
- Параметры
-
matrix матрица для разложения
Этот метод использует текущие параметры computationOptions, как уже передаваемые конструктору или compute(const MatrixType&, unsigned int).
compute() [2/2]
| JacobiSVD< MatrixType, QRPreconditioner > & Eigen::JacobiSVD< MatrixType, QRPreconditioner >::compute | ( | const MatrixType & | matrix, |
| unsigned int | computationOptions | ||
| ) |
Метод, выполняющий разложение заданной матрицы с использованием настраиваемых параметров.
- Параметры
-
matrix матрица для разложения computationOptions необязательный параметр, позволяющий указать, хотите ли вы вычислить полные или тонкие унитарные матрицы U или V. По умолчанию они не вычисляются. Это битовое поле, возможные биты: ComputeFullU, ComputeThinU, ComputeFullV, ComputeThinV.
Тонкие унитарные матрицы доступны только если у вашего типа матрицы количество столбцов динамическое (например, MatrixXf). Они также недоступны с (непосредственным) FullPivHouseholderQR предварительным процессором.
rows()
| inline |
- Возвращает
- количество строк.
- См. также
- cols(), RowsAtCompileTime
The documentation for this class was generated from the following file:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1JacobiSVD.html