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_i
、W_j
和C
的逆。这些方程与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);
}
相关文章:
- 没有找到相关文章