R和C++中大矩阵的迹和逆

Trace and inverse of big matrices in R and C++

本文关键字:C++      更新时间:2023-10-16

我需要计算两个与约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,但我不确定它是否能够计算我的方程。

您可以使用RcppArmadillo,但必须小心内存使用。如果您将以下代码保存为arma_test.cpp,则可以通过Rcpp::sourceCpp('w_graph_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);
}
相关文章:
  • 没有找到相关文章