Greetings and Salutations Wagner,

1. I think you solved your own initial problem as it relates to solving 
matrices within eigen using the “solver” class.

e.g.

SparseMatrix<double> A;
SparseMatrix<double> B;

SolverClassName<SparseMatrix<double> > solver(A);

SparseMatrix<double> x = solver.solve(B);

2. Taking a square root of a matrix in Eigen is not supported officially. There 
does exist an unsupported square root feature for standard (e.g. not sparse 
matrices).

See: 
http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1MatrixSquareRoot.html

To use these features, add the include:  #include 
<unsupported/Eigen/MatrixFunctions>

3. Or write your own square root function using eigenvalues and eigenvectors!

Though, it seems that Eigen does not have built in support for obtaining 
eigenvalues & eigenvectors for a sparse matrix. You might need a secondary 
library to do so.

On the other hand, such support exists in Armadillo. However, ARPACK must be 
enabled / linked to. Unfortunately, this will probably not ever happen for 
RcppArmadillo since it is a pure template package.

With that being said, here’s some sample code for armadillo:

#include <RcppArmadillo.h>
using namespace Rcpp;

// Non-sparse decomp
// Assumes eigen decomp is real.
// [[Rcpp::export]]
arma::mat sqrt_mat(arma::mat x){

  arma::cx_vec eigval;
  arma::cx_mat eigvec;

  eig_gen(eigval, eigvec, x);

  return arma::conv_to<arma::mat>::from(
    eigvec*diagmat(1.0/sqrt(eigval))*trans(eigvec)
    );
}


// Sparse decomp
// Requires ARPACK to be enabled
// Assumes eigen decomp is real.
// [[Rcpp::export]]
arma::sp_mat sqrt_mat_sp(arma::sp_mat x){

  arma::cx_vec eigval;
  arma::cx_mat eigvec;

  eigs_gen(eigval, eigvec, x, x.n_cols);

  return
    eigvec*diagmat(1.0/sqrt(eigval))*trans(eigvec);
}

/*** R
x = matrix(c(5,2,2,5),nrow=2)

sqrt_mat(x)

library(Matrix)
sx = Matrix(X, sparse=T)

# Will error without ARPACK enabled.
#sqrt_mat_sp(x)
*/

Sincerely,

JJB


On Jun 8, 2015, at 2:37 AM, Wagner Bonat 
<wbo...@gmail.com<mailto:wbo...@gmail.com>> wrote:

Dear all,

I need to solve a linear system using only the lower triangular matrix from the 
Cholesky decomposition of a SPD matrix. My goal is to compute C^{-1/2} V^{-1/2} 
where V^{-1/2} and C are known matrices.
For general matrix class MatrixXd I can do using the code below. But, now I 
would like to do the same using the SparseMatrix class. I tried to adapt my 
code, but it did not work. Any help will be welcome.


src <- '
using namespace Rcpp;
using namespace Eigen;
const Map<MatrixXd> Omega(as<Map<MatrixXd> >(Omegas));
const Map<MatrixXd> invSqrtV(as<Map<MatrixXd> >(invSqrtVs));
MatrixXd LT = Omega.llt().matrixL().solve(invSqrtV);
return wrap(LT);'


srcsparse <- '
using Eigen::Map;
using Eigen::SparseMatrix;
using Eigen::LLT;

const SparseMatrix<double> Omega(as<SparseMatrix<double> >(Omegas));
const SparseMatrix<double> invSqrtV(as<SparseMatrix<double> >(invSqrtVs));
Eigen::SimplicialLLT<SparseMatrix<double>, Eigen::Lower> solver;
SparseMatrix<double>  LT = solver.compute(Omega).matrixL().solve(invSqrtV);
return wrap(LT);'

The problem is that there is no .solve() method associated with the matrixL().
It is just a intermediary step when computing

solver.compute(Omega).solve(invSqrtV)

This code computing C^{-1}V^{-1/2}, but I want only C^{-1/2}V^{-1/2}. It will 
be used on the Generalized Kronecker product in the context of multivariate 
spatial models.

Thank you.
--
Wagner Hugo Bonat
----------------------------------------------------------------------------------------------
Department of Mathematics and Computer Science (IMADA)
University of Southern Denmark (SDU) and
Laboratório de Estatística e Geoinformação (LEG)
Universidade Federal do Paraná (UFPR)

_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org<mailto:Rcpp-devel@lists.r-forge.r-project.org>
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to