我想实现一个代码来计算两个矩阵之和的逆。我的算法是递归的,我需要使用循环for()
我试图在R,但我的代码是非常缓慢的。然后,我正在尝试使用RcppArmadillo,但是我的代码非常慢。我认为我做错了一些事情。让我展示我的R代码。两个矩阵之和的反函数
mySolveR <- function(A,B){
ncol = dim(B)[1]
ZERO.B <- Matrix(0,ncol = ncol, nrow = ncol)
invCi <- A
for(i in 1:ncol){
ZERO.B[,i] <- B[,i]
gi <- 1/(1 + sum(diag(ZERO.B%*%invCi)))
invCi <- invCi - gi*(invCi%*%ZERO.B%*%invCi)
ZERO.B[,i] <- 0
}
return(invCi)}
现在我的C++代码使用RcppArmadillo。
src <- '
Rcpp::NumericMatrix Ac(A); // creates Rcpp matrix from SEXP
Rcpp::NumericMatrix Bc(B);
int n = Ac.nrow(), k = Ac.ncol();
arma::mat A(Ac.begin(), n, k, false); // reuses memory and avoids extra copy
arma::mat B(Bc.begin(), n, k, false);
arma::mat Z(n,k);
Z.zeros();
arma::mat invCi = A;
for(int i = 0 ; i < n ; i++){
Z.col(i) = B.col(i);
double gi = 1/(1 + trace(Z*invCi));
invCi = invCi - gi*(invCi*Z*invCi);
Z.zeros() ;
}
return wrap(invCi);'
我正在使用内联包来编译我的函数。
mySolveCpp <- cxxfunction(signature(A = "numeric", B = "numeric"),
src, plugin="RcppArmadillo")
现在考虑下面的简单的例子,
A <- diag(5)
B <- matrix(c(1,-1,0,0,0, -1, 2, -1,0,0, 0,-1,2,-1,0,
0,0,-1,2,-1, 0,0,0,-1,1),5,5)
使用我的函数来计算A的逆+ B
mySolveCpp(A,B)
mySolveR(A,B)
你可以看到我的功能很好地工作,在这个小例。但是我想将这个算法应用于15000 x 15000左右的矩阵。在这种情况下,我的R代码不起作用,而我的C++代码非常慢,花了几个小时来计算逆。我想知道是否可以提高我的C++代码来处理大矩阵,为15000×15000
最佳
如果'A'不一个对角矩阵,这不会给出与他们的算法相同的结果。 – Roland 2014-08-29 09:24:31
我明白了,你是对的@罗兰。 – ddiez 2014-08-29 09:36:31
是的,但它只适用于小矩阵。我想用于15000 x 15000左右的大矩阵。 – wagner 2014-08-29 11:46:14