Сложная разреженная обратная матрица броненосца

Пишу программу на Armadillo C++ (4.400.1)

У меня есть матрица, которая должна быть разреженной и сложной, и я хочу вычислить обратную такую ​​матрицу. Поскольку она разреженная, она может быть псевдообратной, но я могу гарантировать, что матрица имеет полную диагональ.

В документации API Armadillo упоминается метод .i() для вычисления обратной любой матрицы, но члены sp_cx_mat не содержат такого метода, а функции inv() или pinv(), по-видимому, не могут обрабатывать тип sp_cx_mat.

sp_cx_mat Y;

/*Fill Y ensuring that the diagonal is full*/

sp_cx_mat Z = Y.i();

or

sp_cx_mat Z = inv(Y);

Ни один из них не работает.

Я хотел бы знать, как вычислить обратную матрицу типа sp_cx_mat.


person Santi Peñate-Vera    schedule 01.11.2014    source источник
comment
Каковы размеры? Х*Х или Х*У?   -  person Surt    schedule 01.11.2014
comment
Матрица квадратная, поэтому X на X   -  person Santi Peñate-Vera    schedule 01.11.2014
comment
Обратная разреженная матрица не обязательно разреженная. Вам действительно нужна обратная разреженная матрица? Вся литература, которую я видел, после беглого поиска рекомендует решать основную проблему по-другому. т.е. использовать итерационные методы (или другие) для решения Ax = b.   -  person Unapiedra    schedule 05.11.2014
comment
Вы можете вычислить СВД. Пусть U S V == Y, затем Y.pinv() == U S.pinv() V. Поскольку Y имеет полный ранг (из-за этой диагонали), Armadillo::svd_econ() не имеет смысла. Таким образом, вычисление SVD будет значительно медленнее, чем другие методы решения псевдообратной задачи.   -  person Unapiedra    schedule 05.11.2014
comment
Да, мне нужна обратная матрица, потому что эта обратная матрица будет использоваться для решения систем (A^-1)x=b. Отсутствие расчета перевернутой матрицы заставило бы меня переформулировать все электрические модели, заполняющие исходную необращенную матрицу.   -  person Santi Peñate-Vera    schedule 05.11.2014
comment
действительно, Y.pinv() хорош, но его нет в библиотеке для сложных разреженных матриц.   -  person Santi Peñate-Vera    schedule 05.11.2014
comment
Если вы хотите решить (A^-1)x=b, почему бы вам вместо этого не решить x=Ab?   -  person dani    schedule 05.11.2014
comment
Поскольку некоторые элементы в x и b отсутствуют, поэтому система решается с использованием методов Ньютона-Рафсона.   -  person Santi Peñate-Vera    schedule 05.11.2014


Ответы (1)


Поддержка разреженных матриц в Armadillo не является полной, и многие факторизации/сложные операции, доступные для плотных матриц, недоступны для разреженных матриц. Этому есть ряд причин, главная из которых заключается в том, что эффективные сложные операции, такие как факторизация разреженных матриц, все еще остаются открытым полем для исследований. Таким образом, функция .i() недоступна для cx_sp_mat или других типов sp_mat. Другой причиной этого является нехватка времени у разработчиков разреженных матриц (... в том числе и у меня).

Учитывая, что обратная разреженная матрица, как правило, будет плотной, вам может быть лучше просто превратить cx_sp_mat в cx_mat, а затем использовать те же методы обращения, которые вы обычно применяете для плотных матриц. Поскольку вы в любом случае планируете представить это как плотную матрицу, справедливо предположить, что у вас достаточно оперативной памяти для этого.

person ryan    schedule 05.11.2014