我试图理解为什么调用 arma::pinv 的 Armadillo与通过 RcppArmadillo 在 R中调用相同的函数相比,直接在 c++ 中调用(Visual Studio)需要更多的时间。
在 RI 中,编译/生成包时只是遵循了一种超级基本的方法
MyPackageName <- "thetestpackage"
RcppArmadillo.package.skeleton(MyPackageName, example_code = FALSE)
compileAttributes(pkgdir = paste0("./",MyPackageName), verbose = TRUE)
install(MyPackageName)
在 VisualStudio 中,我使用 NuGet 包管理器安装了“犰狳代码”和“OpenBLAS”,但我也尝试下载犰狳并使用“附加包含目录”包含库:结果相同。
我的感觉是我没有有效地使用 LAPACK 和/或 BLAS。你有什么想法?提前非常感谢!
在 VS 中运行的 c++ 代码如下,在 i = 1000(迭代)和 n = 100(矩阵大小)的情况下运行大约需要 25 秒
#include <iostream>
#include <armadillo>
#include <chrono>
arma::mat rcpparma_myfun(int i, int n) {
arma::mat A(n, n);
A.randn();
arma::mat B;
B = arma::pinv(A);
auto start = std::chrono::high_resolution_clock::now();
for (int ii = 0; ii < i; ii++) {
B = arma::pinv(A);
}
auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - start;
std::cout << "Elapsed time: " << elapsed.count() << " s\n";
return B;
}
int main()
{
int iters;
int size;
std::cout << "Enter iteration\n";
std::cin >> iters;
std::cout << "Enter size\n";
std::cin >> size;
arma::mat BB;
BB = rcpparma_myfun(iters, size);
}
用于 RccpArmadillo 的 cpp 函数如下所示,运行 i = 1000(迭代)和 n = 100(矩阵大小)大约需要 8 秒:
#include "RcppArmadillo.h"
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat rcpparma_myfun(int i, int n) {
arma::mat A(n,n);
A.randn();
arma::mat B;
B = arma::pinv(A);
for (int ii = 0; ii < i; ii++) {
B = arma::pinv(A);
}
return B;
}
``