используя преобразования Холецкого. Здесь P — матрица перестановки, Q — унитарная матрица, а R — верхняя треугольная матрица.
Это разложение выполняет выбор столбцов, чтобы определить ранг и улучшить числовую устойчивость. Оно медленнее, чем HouseholderQR, и быстрее, чем FullPivHouseholderQR.
Конструктор по умолчанию полезен в тех случаях, когда пользователь намерен выполнить разложение с помощью ColPivHouseholderQR::compute(const MatrixType&).
модуль определителя матрицы, для которой *this является разложением QR. Она имеет только линейную сложность (то есть O(n), где n — размер квадратной матрицы), так как разложение QR уже вычислено.
Примечание
Только для квадратных матриц.
Предупреждение
определитель может быть очень большим или очень малым, поэтому для матриц достаточно большого размера существует риск переполнения/потери точности. Одним из способов обойти это — использовать logAbsDeterminant() вместо этого.
размер ядра матрицы, для которой *this является разложением QR.
Примечание
Этот метод должен определить, какие главные элементы должны рассматриваться как ненулевые. Для этого он использует пороговое значение, которое вы можете контролировать, вызывая setThreshold(const RealScalar&).
обратную матрицу, для которой *this является разложением QR.
Примечание
Если эта матрица необратима, возвращаемая матрица имеет неопределённые коэффициенты. Сначала используйте isInvertible(), чтобы определить, обратима ли эта матрица.
true, если матрица, для которой *this является QR-разложением, представляет инъективное линейное отображение, т. е. имеет тривиальное ядро; в противном случае — false.
Примечание
Данный метод должен определить, какие главные элементы следует считать ненулевыми. Для этого используется порог, который можно контролировать, вызвав setThreshold(const RealScalar&).
true, если матрица, для которой *this является QR-разложением, обратима.
Примечание
Данный метод должен определить, какие главные элементы следует считать ненулевыми. Для этого используется порог, который можно контролировать, вызвав setThreshold(const RealScalar&).
true, если матрица, для которой *this является QR-разложением, представляет сюръективное линейное отображение; в противном случае — false.
Примечание
Данный метод должен определить, какие главные элементы следует считать ненулевыми. Для этого используется порог, который можно контролировать, вызвав setThreshold(const RealScalar&).
натуральный логарифм абсолютного значения определителя матрицы, для которой *this является QR-разложением. Имеет линейную сложность (т. е. O(n), где n — размер квадратной матрицы), так как QR-разложение уже вычислено.
Примечание
Только для квадратных матриц.
Этот метод полезен для работы с риском переполнения/потерь точности при вычислении определителя.
количество ненулевых главных элементов в QR-разложении. Здесь ненулевой понимается в точном смысле, а не в смысле приближенного значения. Понятие не является в некотором смысле принципиально интересным, но все же полезно при реализации алгоритмов.
ранг матрицы, для которой *this является QR-разложением.
Примечание
Данный метод должен определить, какие главные элементы следует считать ненулевыми. Для этого используется порог, который можно контролировать, вызвав setThreshold(const RealScalar&).
Позволяет задать порог, который будет использоваться некоторыми методами, такими как rank(), которым необходимо определить, когда главные элементы следует считать ненулевыми. Это не используется для самого QR-разложения.
При необходимости получения значения порога, Eigen вызывает threshold(). По умолчанию используется формула для автоматического определения разумного порога. После вызова данного метода setThreshold(const RealScalar&) используется ваше значение вместо него.
Параметры
threshold
Новое значение, используемое в качестве порога.
Главный элемент будет считаться ненулевым, если его абсолютное значение строго больше \( \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \), где maxpivot — наибольший главный элемент.
Этот метод находит решение x для уравнения Ax=b, где A — матрица, QR-разложение которой представлено данным объектом, если такое решение существует.
Параметры
b
правая часть уравнения, которое требуется решить.
Возвращаемое значение
решение.
Этот метод просто пытается найти наилучшее возможное решение. Если вы хотите проверить, существует ли решение или оно точное, просто вызовите эту функцию, чтобы получить результат, а затем вычислите ошибку этого результата или используйте MatrixBase::isApprox() напрямую, например, так:
Этот метод избегает деления на ноль, поэтому отсутствие решения само по себе не означает, что вы получите inf или nan значения.
Если существует более одного решения, этот метод произвольно выберет одно.
Пример:
Matrix3f m = Matrix3f::Random();
Matrix3f y = Matrix3f::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is the matrix y:" << endl << y << endl;
Matrix3f x;
x = m.colPivHouseholderQr().solve(y);
assert(y.isApprox(m*x));
cout << "Here is a solution x to the equation mx=y:" << endl << x << endl;
Вывод:
Here is the matrix m:
0.68 0.597 -0.33
-0.211 0.823 0.536
0.566 -0.605 -0.444
Here is the matrix y:
0.108 -0.27 0.832
-0.0452 0.0268 0.271
0.258 0.904 0.435
Here is a solution x to the equation mx=y:
0.609 2.68 1.67
-0.231 -1.57 0.0713
0.51 3.51 1.05