Я думаю, что ответ @ chtz почти верен, за исключением того, что нам нужно взять последние столбцы A.cols () - qr.rank ().Вот математический вывод.
Скажем, мы делаем QR-разложение вашей матрицы Aᵀ как
Aᵀ * P = [Q₁ Q₂] * [R;0] = Q₁ * R
, где P - матрица перестановок, таким образом
Aᵀ = Q₁ * R * P⁻¹.
Мы можем видеть, что Range (Aᵀ)= Диапазон (Q₁ * R * P⁻¹) = Диапазон (Q₁) (потому что оба P и R являются обратимыми).
Поскольку Aᵀ и Q₁ имеют одинаковое пространство диапазона, это означает, что A и Q also также будутимеют одинаковое нулевое пространство, а именно Null (A) = Null (Q₁ᵀ).(Здесь мы используем свойство, что Range (M) и Null (Mᵀ) дополняют друг друга для любой матрицы M
, следовательно, Null (A) = дополнение (Range (Aᵀ)) = дополнение (Range (Q₁)) =Null (Q₁ᵀ)).
С другой стороны, поскольку матрица [Q₁ Q₂] ортонормирована, Null (Q₁ᵀ) = Range (Q₂), поэтому Null (A) = Range (Q₂), т.е.kernal (A) = Q₂.
Поскольку Q₂ - это правильные столбцы A.cols () - qr.rank (), вы можете вызвать rightCols(A.cols() - qr.rank())
, чтобы получить ядро A.
Для получения дополнительной информации о пространстве ядра вы можете обратиться к https://en.wikipedia.org/wiki/Kernel_(linear_algebra)