Search code examples
c++sparse-matrixarmadillomatrix-inverse

Armadillo complex sparse matrix inverse


I'm writing a program with Armadillo C++ (4.400.1)

I have a matrix that has to be sparse and complex, and I want to calculate the inverse of such matrix. Since it is sparse it could be the pseudoinverse, but I can guarantee that the matrix has the full diagonal.

In the API documentation of Armadillo, it mentions the method .i() to calculate the inverse of any matrix, but sp_cx_mat members do not contain such method, and the inv() or pinv() functions cannot handle the sp_cx_mat type apparently.

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);

None of them work.

I would like to know how to compute the inverse of matrices of sp_cx_mat type.


Solution

  • Sparse matrix support in Armadillo is not complete and many of the factorizations/complex operations that are available for dense matrices are not available for sparse matrices. There are a number of reasons for this, the largest being that efficient complex operations such as factorizations for sparse matrices is still very much an open research field. So, there is no .i() function available for cx_sp_mat or other sp_mat types. Another reason for this is lack of time on the part of the sparse matrix developers (...which includes me).

    Given that the inverse of a sparse matrix is generally going to be dense, then you may simply be better off turning your cx_sp_mat into a cx_mat and then using the same inversion techniques that you normally would for dense matrices. Since you are planning to represent this as a dense matrix anyway, then it's a fair assumption that you have enough RAM to do that.