Я пытаюсь реализовать код для вычисления обратной суммы двух матриц. Мой алгоритм рекурсивный, и мне нужно использовать цикл 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
Вижу, вы правы @ Роланд. – ddiez
Да, но это работа только для небольших матриц. Я хочу использовать для большой матрицы около 15000 x 15000. – wagner