с использованием преобразований Хаусхолдера. Здесь P и P' — это матрицы перестановок, Q — унитарная матрица, а R — верхняя треугольная матрица.
Это разложение выполняет очень осторожный полный поворот, чтобы раскрыть ранг и обеспечить оптимальную числовую устойчивость. Цена этого — более низкая скорость по сравнению с HouseholderQR и ColPivHouseholderQR.
Конструктор по умолчанию полезен в тех случаях, когда пользователь намерен выполнить разложение с помощью FullPivHouseholderQR::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 — матрица, для которой *this является QR-разложением.
Параметры
b
правая часть уравнения, которое нужно решить.
Возвращает
точное или наименьшее-квадратичное решение, если ранг больше или равен количеству столбцов A, и произвольное решение в противном случае.
Этот метод просто пытается найти наилучшее возможное решение. Если вы хотите проверить, существует ли решение или оно точное, просто вызовите эту функцию, чтобы получить результат, а затем вычислите ошибку этого результата или используйте 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.fullPivHouseholderQr().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