我需要计算与大约30000 x 30000密度矩阵的迹线和逆相关的两个方程。方程是
-trace( W_i %*% C)
和
-trace(W_i %*% C %*% W_j C)
我知道W_i
,W_j
和C
的倒数。这些方程与Pearson估计函数有关。我正在尝试使用R和包Matrix
,但我无法使用solve()
或chol()
和chol2inv()
来计算C矩阵。我不知道有可能使用solve()
来解决方程系统并计算跟踪之后。通常使用求解函数来计算C^{-1} W = solve(C, W)
之类的东西,但我的等式有点不同。欢迎任何帮助。我正在考虑使用RcppArmadillo,但我不确定它是否能够计算我的方程式。
答案 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);
}