我试图使用RcppArmadillo反转复杂的方阵:
# include// [[Rcpp::depends(RcppArmadillo)]] using namespace Rcpp; using namespace arma; // [[Rcpp::export]] cx_mat fn(cx_mat x) { return x.i(); }
但是,这会引发错误sourceCpp
:"undefined reference to zgetri_'
".它编译,如果我只是更换工作正常cx_mat
使用mat
,但随后将只与实矩阵的工作.使用inv()
抛出相同的编译错误.有趣的是,使用伪逆pinv()
传递编译,但结果与R相比略有不同solve()
:
# include// [[Rcpp::depends(RcppArmadillo)]] using namespace Rcpp; using namespace arma; // [[Rcpp::export]] cx_mat fn(cx_mat x) { return pinv(x); } > a<-matrix(c(3+0.1i,7+2i,4+0i,2+0.5i),ncol=2) > a [,1] [,2] [1,] 3+0.1i 4+0.0i [2,] 7+2.0i 2+0.5i > identical(solve(a), fn(a)) [1] FALSE > solve(a) - fn(a) [,1] [,2] [1,] -6.938894e-17-7.80626e-18i 8.326673e-17-6.93889e-18i [2,] 1.665335e-16+1.95156e-17i -1.665335e-16+4.16334e-17i
我知道在这种情况下,不同之处在于机器精度的调整,但我仍然想知道是否有任何方法可以获得inv()
或.i()
处理复杂的矩阵.谢谢.
如果您使用Rlapack.so将RcppArmadillo与R安装一起使用,例如在Windows或某些RedHat系统上,则这是一个已知问题.
最好的答案是
不使用复杂值函数,因为Rlapack 有一些但很遗憾不是全部(但你可能没有选择)
重新配置你R安装使用完整的外部liblapack.so
我们在RcppArmadillo repo有三张门票(实际上我今天还添加了一张,其中列出了 Armadillo使用但缺少Rlapack.so 的十二个缺失的复杂功能),我刚刚请求R Core添加更复杂值的函数到Rlapack.
并且只是强调第二点,你的例子在这里运行正常,因为我不在Debian/Ubuntu版本上使用Rlapack:
R> library(Rcpp) R> sourceCpp("/tmp/aenima.cpp") R> a <- matrix(c(3+0.1i,7+2i,4+0i,2+0.5i),ncol=2) R> fn(a) [,1] [,2] [1,] -0.0898473+0.0029949i 0.167715-0.047919i [2,] 0.3174603+0.0000000i -0.126984+0.031746i R>
使用稍微修改过的文件版本,最后是示例:
# include// [[Rcpp::depends(RcppArmadillo)]] using namespace Rcpp; using namespace arma; // [[Rcpp::export]] cx_mat fn(cx_mat x) { return x.i(); } /*** R a <- matrix(c(3+0.1i,7+2i,4+0i,2+0.5i),ncol=2) fn(a) */