У меня вопрос о библиотеке Eigen в C++. На самом деле, я хочу рассчитать инверсную матрицу разреженной матрицы. Когда я использовал Dense-матрицу в Eigen, я могу использовать операцию .inverse() для вычисления инверсии плотной матрицы. Но в разреженной матрице я нигде не могу найти обратную операцию. Кто-нибудь, кто знает, чтобы вычислить инверсию разреженной матрицы? Помоги мне.Как рассчитать инверсию разреженной матрицы в Eigen-библиотеке
ответ
Вы не можете сделать это напрямую, но вы всегда можете рассчитать его, используя один из разреженных решателей. Идея состоит в том, чтобы решить A*X=I
, где I - единичная матрица. Если есть решение, X будет вашей обратной матрицей. The eigen documentation имеет страницу о разреженных решателях и как использовать их, но основные шаги заключаются в следующих:
SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);
SparseMatrix<double> I(n,n);
I.setIdentity();
auto A_inv = solver.solve(I);
Это не математически значимый.
Редкая матрица необязательно имеет разреженный инверсный характер.
Вот почему метод недоступен.
Это справедливо и для плотных матриц, математически нет разницы. Более того, это дорого стоить, тем более, что разреженные матрицы, как правило, большие. – MatthiasB
Вы можете найти пример о обратном разреженной комплексной матрице
я использовал класс SimplicialLLT,
вы можете найти другой класс из сильфона
http://eigen.tuxfamily.org/dox-devel/group__TopicSparseSystems.html
Эта страница может помочь вам с правильным именем класса для вашей работы (spead, точность и dimmenssion вашей матрицы)
////////////////////// In His Name \\\\\\\\\\\\\\\\\\\\\\\\\\\
#include <iostream>
#include <vector>
#include <Eigen/Dense>
#include <Eigen/Sparse>
using namespace std;
using namespace Eigen;
int main()
{
SparseMatrix< complex<float> > A(4,4);
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
A.coeffRef(i, i) = i+j;
}
}
A.insert(2,1) = {2,1};
A.insert(3,0) = {0,0};
A.insert(3,1) = {2.5,1};
A.insert(1,3) = {2.5,1};
SimplicialLLT<SparseMatrix<complex<float> > > solverA;
A.makeCompressed();
solverA.compute(A);
if(solverA.info()!=Success) {
cout << "Oh: Very bad" << endl;
}
SparseMatrix<float> eye(4,4);
eye.setIdentity();
SparseMatrix<complex<float> > inv_A = solverA.solve(eye);
cout << "A:\n" << A << endl;
cout << "inv_A\n" << inv_A << endl;
}
Небольшое расширение на @Soheib и @ ответы MatthiasB, в если вы используете Eigen::SparseMatrix<float>
это лучше используйте SparseLU, а не SimplicialLLT или SimplicialLDLT, они произвели неправильные ответы со мной на поплавковых матрицах
- 1. Как распараллелить инверсию разреженной матрицы?
- 2. Рассчитать сходство разреженной матрицы
- 3. как правильно вычислить инверсию матрицы?
- 4. Ускорить вычисления разреженной матрицы
- 5. Можно ли вычислить инверсию разреженной матрицы в Python так же быстро, как в Matlab?
- 6. Пытаясь вычислить инверсию квадратной матрицы
- 7. Как найти инверсию почти сингулярной матрицы?
- 8. Минимальное представление разреженной матрицы
- 9. Как извлечь элементы разреженной матрицы?
- 10. Графическая карта разреженной матрицы
- 11. Однораздельное разложение разреженной матрицы
- 12. сложность формирования разреженной матрицы
- 13. ненулевые элементы разреженной матрицы
- 14. R построения разреженной матрицы
- 15. Python: Участок разреженной матрицы
- 16. Инверсия разреженной матрицы
- 17. Элементы разреженной матрицы
- 18. Создание разреженной матрицы в цикле
- 19. Участок разреженной матрицы в matlab
- 20. Создание плотной матрицы из разреженной матрицы в Numpy питона
- 21. Создание разреженной матрицы в Python
- 22. транспонированная разреженной матрицы в C++
- 23. Заполнение разреженной матрицы в R
- 24. Как обновить значения разреженной матрицы в Armadillo
- 25. SQRT для поэлементно разреженной матрицы
- 26. создание разреженной матрицы неизвестного размера
- 27. Чтение из файла разреженной матрицы
- 28. Theano градиент умножения разреженной матрицы
- 29. Умножение разреженной матрицы, связанный список
- 30. Создание разреженной матрицы из TermDocumentMatrix
Поместите еще несколько тегов, чтобы привлечь, возможно, более полные ответы. – Bathsheba
Ага .. Спасибо Я попробую – kujungmul
Но мой кроткий ответ действительно стоит! – Bathsheba