C++ R和C++;

C++ R和C++;,c++,r,math,rcpp,armadillo,C++,R,Math,Rcpp,Armadillo,我需要计算两个与30000x30000密度矩阵的迹和逆相关的方程。方程是 -trace( W_i %*% C) 及 我知道W_I,W_j和C的倒数。这些方程与皮尔逊估计函数有关。我试图使用R和packageMatrix,但无法使用solve()或chol()和chol2inv()计算C矩阵。我不知道用solve()解方程组和计算轨迹后是否可能。通常使用solve函数来计算类似于C^{-1}W=solve(C,W)的东西,但我的公式有点不同。欢迎任何帮助。我正在考虑使用RcppArmadill

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

-trace( W_i %*% C) 


我知道
W_I
W_j
C
的倒数。这些方程与皮尔逊估计函数有关。我试图使用R和package
Matrix
,但无法使用
solve()
chol()
chol2inv()
计算C矩阵。我不知道用
solve()
解方程组和计算轨迹后是否可能。通常使用solve函数来计算类似于
C^{-1}W=solve(C,W)
的东西,但我的公式有点不同。欢迎任何帮助。我正在考虑使用RcppArmadillo,但我不确定它是否能够计算我的方程式。

您可以使用RcppArmadillo,但必须注意内存使用。如果将以下代码另存为
arma\u test.cpp
,则可通过
Rcpp::sourceCpp('w\u graph\u class.cpp')
获取。显然,矩阵数据是虚拟的,但它应该为您提供一个起点。另外,请查看反转
C
的替代方法,而不是使用
.i()
,例如
pinv()

请看这篇关于使用RcppArmadillo的大型矩阵的文章

#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);
}
#包括
使用名称空间Rcpp;
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
Rcpp::列出arma_calc(){
arma::mat C_inv=arma::mat(300003000,arma::fill::randu);
arma::mat W_i=arma::mat(30000300000,arma::fill::randu);
arma::mat W_j=arma::mat(30000300000,arma::fill::randu);
double tru 1=-arma::trace(W_i*C_inv.i());
double tr_2=-arma::trace(W_i*C_inv.i()*W_j*C_inv.i());
返回Rcpp::List::create(Rcpp::Named(“Trace1”)=tr_1,Rcpp::Named(“Trace2”)=tr_2);
}

如果你能提供一个小矩阵的例子,它将澄清关于你的问题的几点,并提供一个制定答案的目标。
#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);
}