Eigen::HouseholderSequence
template<typename VectorsType, typename CoeffsType, int Side>
class Eigen::HouseholderSequence< VectorsType, CoeffsType, Side >
Последовательность отражений Хаусхолдера, действующих на подпространства с уменьшающимся размером.
Определена в модуле Хаусхолдера.
#include <Eigen/Householder>
- Параметры шаблона
-
VectorsType тип матрицы, содержащей векторы Хаусхолдера CoeffsType тип вектора, содержащего коэффициенты Хаусхолдера Side либо OnTheLeft (по умолчанию), либо OnTheRight
Этот класс представляет последовательность произведения отражений Хаусхолдера, где первое отражение Хаусхолдера действует на всё пространство, второе отражение Хаусхолдера оставляет инвариантным одномерное подпространство, натянутое на первый единичный вектор, третье отражение Хаусхолдера оставляет инвариантным двумерное подпространство, натянутое на первые два единичных вектора и так далее, вплоть до последнего отражения, которое оставляет все, кроме одного измерения, инвариантным и действует только на последнее измерение. Такие последовательности отражений Хаусхолдера используются в нескольких алгоритмах для обнуления определённых частей матрицы. Действительно, методы HessenbergDecomposition::matrixQ(), Tridiagonalization::matrixQ(), HouseholderQR::householderQ() и ColPivHouseholderQR::householderQ() все возвращают HouseholderSequence.
Более точно, класс HouseholderSequence представляет \( n \times n \) матрицу \( H \) вида \( H = \prod_{i=0}^{n-1} H_i \), где i-е отражение Хаусхолдера равно \( H_i = I - h_i v_i v_i^* \). i-й коэффициент Хаусхолдера \( h_i \) — скаляр, а i-й вектор Хаусхолдера \( v_i \) — вектор вида
\[ v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ нулей}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ произвольных элементов}} ]. \]
Последние \( n-i \) элементов \( v_i \) называются существенной частью вектора Хаусхолдера.
Типичные примеры использования приведены ниже, где H — HouseholderSequence:
A.applyOnTheRight(H); // A = A * H A.applyOnTheLeft(H); // A = H * A A.applyOnTheRight(H.adjoint()); // A = A * H^* A.applyOnTheLeft(H.adjoint()); // A = H^* * A MatrixXd Q = H; // conversion to a dense matrix
Помимо сопряжённого, вы также можете применить обратные (=сопряжённые), транспонированные и сопряжённо-транспонированные операторы.
См. документацию для HouseholderSequence(const VectorsType&, const CoeffsType&) для примера.
| AdjointReturnType | adjoint () const |
| Присоединённое (сопряжённо-транспонированное) преобразование последовательности Хаусхолдера. |
|
| EIGEN_CONSTEXPR Index | cols () const EIGEN_NOEXCEPT |
| Количество столбцов преобразования, рассматриваемого как матрица. Подробнее... |
|
| ConjugateReturnType | conjugate () const |
| Комплексно-сопряжённая последовательность Хаусхолдера. |
|
| template<bool Cond> | |
| internal::conditional< Cond, ConjugateReturnType, ConstHouseholderSequence >::type | conjugateIf () const |
| const EssentialVectorType | essentialVector (Index k) const |
| Необходимая часть вектора Хаусхолдера. Подробнее... |
|
| HouseholderSequence (const HouseholderSequence &other) | |
| Конструктор копирования. |
|
| HouseholderSequence (const VectorsType &v, const CoeffsType &h) | |
| Конструктор. Подробнее... |
|
| AdjointReturnType | inverse () const |
|
Обратное преобразование последовательности Хаусхолдера (равно сопряжённо-транспонированному). |
|
| Index | length () const |
| Возвращает длину последовательности Хаусхолдера. |
|
| template<typename OtherDerived > | |
| internal::matrix_type_times_scalar_type< Scalar, OtherDerived >::Type | operator* (const MatrixBase< OtherDerived > &other) const |
| Вычисляет произведение последовательности Хаусхолдера на матрицу. Подробнее... |
|
| EIGEN_CONSTEXPR Index | rows () const EIGEN_NOEXCEPT |
| Количество строк преобразования, рассматриваемого как матрица. Подробнее... |
|
| HouseholderSequence & | setLength (Index length) |
| Устанавливает длину последовательности Хаусхолдера. Подробнее... |
|
| HouseholderSequence & | setShift (Index shift) |
| Устанавливает сдвиг последовательности Хаусхолдера. Подробнее... |
|
| Index | shift () const |
| Возвращает сдвиг последовательности Хаусхолдера. |
|
| TransposeReturnType | transpose () const |
| Транспонированная последовательность Хаусхолдера. |
|
|
| |
| EIGEN_CONSTEXPR Index | cols () const EIGEN_NOEXCEPT |
| HouseholderSequence< VectorsType, CoeffsType, Side > & | derived () |
| const HouseholderSequence< VectorsType, CoeffsType, Side > & | derived () const |
| EIGEN_CONSTEXPR Index | rows () const EIGEN_NOEXCEPT |
| EIGEN_CONSTEXPR Index | size () const EIGEN_NOEXCEPT |
|
| |
| typedef Eigen::Index | Index |
| Тип индексов. Подробнее... |
|
HouseholderSequence()
| inline |
Конструктор.
- Parameters
-
[in] v Матрица, содержащая необходимые части векторов Хаусхолдера. [in] h Вектор, содержащий коэффициенты Хаусхолдера.
Создаёт последовательность Хаусхолдера с коэффициентами, заданными h, и векторами, заданными v. i-й коэффициент Хаусхолдера \( h_i \) задаётся h(i), а необходимая часть i-го вектора Хаусхолдера \( v_i \) задаётся v(k,i) при k > i (частично-диагональная часть i-го столбца). Если v имеет меньше столбцов, чем строк, то последовательность Хаусхолдера содержит столько отражений Хаусхолдера, сколько столбцов.
- Note
- Объект HouseholderSequence хранит
vиhпо ссылке.
Пример:
Matrix3d v = Matrix3d::Random(); cout << "The matrix v is:" << endl; cout << v << endl; Vector3d v0(1, v(1,0), v(2,0)); cout << "The first Householder vector is: v_0 = " << v0.transpose() << endl; Vector3d v1(0, 1, v(2,1)); cout << "The second Householder vector is: v_1 = " << v1.transpose() << endl; Vector3d v2(0, 0, 1); cout << "The third Householder vector is: v_2 = " << v2.transpose() << endl; Vector3d h = Vector3d::Random(); cout << "The Householder coefficients are: h = " << h.transpose() << endl; Matrix3d H0 = Matrix3d::Identity() - h(0) * v0 * v0.adjoint(); cout << "The first Householder reflection is represented by H_0 = " << endl; cout << H0 << endl; Matrix3d H1 = Matrix3d::Identity() - h(1) * v1 * v1.adjoint(); cout << "The second Householder reflection is represented by H_1 = " << endl; cout << H1 << endl; Matrix3d H2 = Matrix3d::Identity() - h(2) * v2 * v2.adjoint(); cout << "The third Householder reflection is represented by H_2 = " << endl; cout << H2 << endl; cout << "Their product is H_0 H_1 H_2 = " << endl; cout << H0 * H1 * H2 << endl; HouseholderSequence<Matrix3d, Vector3d> hhSeq(v, h); Matrix3d hhSeqAsMatrix(hhSeq); cout << "If we construct a HouseholderSequence from v and h" << endl; cout << "and convert it to a matrix, we get:" << endl; cout << hhSeqAsMatrix << endl;
Вывод:
The matrix v is:
0.68 0.597 -0.33
-0.211 0.823 0.536
0.566 -0.605 -0.444
The first Householder vector is: v_0 = 1 -0.211 0.566
The second Householder vector is: v_1 = 0 1 -0.605
The third Householder vector is: v_2 = 0 0 1
The Householder coefficients are: h = 0.108 -0.0452 0.258
The first Householder reflection is represented by H_0 =
0.892 0.0228 -0.0611
0.0228 0.995 0.0129
-0.0611 0.0129 0.965
The second Householder reflection is represented by H_1 =
1 0 0
0 1.05 -0.0273
0 -0.0273 1.02
The third Householder reflection is represented by H_2 =
1 0 0
0 1 0
0 0 0.742
Their product is H_0 H_1 H_2 =
0.892 0.0255 -0.0466
0.0228 1.04 -0.0105
-0.0611 -0.0129 0.728
If we construct a HouseholderSequence from v and h
and convert it to a matrix, we get:
0.892 0.0255 -0.0466
0.0228 1.04 -0.0105
-0.0611 -0.0129 0.728
- См. также
- setLength(), setShift()
cols()
| inline |
Количество столбцов преобразования, рассматриваемого как матрица.
- Возвращает
- Количество столбцов
Это равно размерности пространства, на котором действует преобразование.
conjugateIf()
| inline |
- Возвращает
- выражение, представляющее комплексно сопряжённое значение
*thisесли Cond==true, в противном случае возвращает*this.
essentialVector()
| inline |
Необходимая часть вектора Хаусхолдера.
- Параметры
-
[in] k Индекс отражения Хаусхолдера
- Возвращает
- Вектор, содержащий нетривиальные элементы k-го вектора Хаусхолдера
Эта функция возвращает необходимую часть вектора Хаусхолдера \( v_i \). Это вектор длины \( n-i \), содержащий последние \( n-i \) элементы вектора
\[ v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ нулей}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ произвольных элементов}} ]. \]
Индекс \( i \) равен k + shift(), соответствующий k-му столбцу матрицы v , переданной в конструктор.
- См. также
- setShift(), shift()
operator*()
| inline |
Вычисляет произведение последовательности Хаусхолдера на матрицу.
- Параметры
-
[in] other Умножаемая матрица.
- Возвращает
- Объект выражения, представляющий произведение.
Эта функция вычисляет \( HM \), где \( H \) — последовательность Хаусхолдера, представленная *this, а \( M \) — матрица other.
rows()
| inline |
Количество строк преобразования, рассматриваемого как матрица.
- Возвращает
- Количество строк
Это равно размерности пространства, на котором действует преобразование.
setLength()
| inline |
Устанавливает длину последовательности Хаусхолдера.
- Параметры
-
[in] length Новое значение для длины.
По умолчанию, длина \( n \) последовательности Хаусхолдера \( H = H_0 H_1 \ldots H_{n-1} \) устанавливается равной количеству столбцов матрицы v , переданной в конструктор, или количеству строк, если оно меньше. После вызова этой функции длина равна length.
- См. также
- length()
setShift()
| inline |
Устанавливает сдвиг последовательности Хаусхолдера.
- Параметры
-
[in] shift Новое значение для сдвига.
По умолчанию, объект HouseholderSequence представляет \( H = H_0 H_1 \ldots H_{n-1} \), и i-й столбец матрицы v , переданной в конструктор, соответствует i-му отражению Хаусхолдера. После вызова этой функции объект представляет \( H = H_{\mathrm{shift}} H_{\mathrm{shift}+1} \ldots H_{n-1} \), и i-й столбец v соответствует (shift+i)-му отражению Хаусхолдера.
- См. также
- shift()
The documentation for this class was generated from the following file:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1HouseholderSequence.html