R和C ++中大矩阵的跟踪和逆

时间:2014-08-25 07:56:50

标签: c++ r math rcpp armadillo

我需要计算与大约30000 x 30000密度矩阵的迹线和逆相关的两个方程。方程是

-trace( W_i %*% C) 

-trace(W_i %*% C %*% W_j C)

我知道W_iW_jC的倒数。这些方程与Pearson估计函数有关。我正在尝试使用R和包Matrix,但我无法使用solve()chol()chol2inv()来计算C矩阵。我不知道有可能使用solve()来解决方程系统并计算跟踪之后。通常使用求解函数来计算C^{-1} W = solve(C, W)之类的东西,但我的等式有点不同。欢迎任何帮助。我正在考虑使用RcppArmadillo,但我不确定它是否能够计算我的方程式。

1 个答案:

答案 0 :(得分:1)

您可以使用RcppArmadillo,但您必须小心内存使用情况。如果您将以下代码保存为arma_test.cpp,则可以通过Rcpp::sourceCpp('w_graph_class.cpp')获取。显然矩阵数据是虚拟的,但它应该给你一个起点。另请查看替代方法以反转C而非使用.i(),例如pinv()等。

有关使用RcppArmadillo

的大型矩阵,请参阅此question
#include <RcppArmadillo.h>
using namespace Rcpp;

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
Rcpp::List arma_calc() {

arma::mat C_inv = arma::mat(30000,30000,arma::fill::randu);
arma::mat W_i = arma::mat(30000,30000,arma::fill::randu);
arma::mat W_j = arma::mat(30000,30000,arma::fill::randu);

double tr_1=-arma::trace(W_i*C_inv.i());

double tr_2=-arma::trace(W_i*C_inv.i()*W_j*C_inv.i());

return Rcpp::List::create(Rcpp::Named("Trace1")=tr_1,Rcpp::Named("Trace2")=tr_2);
}