我试图使用RcppArmadillo反转复杂的方阵:
# include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
cx_mat fn(cx_mat x) {
return x.i();
}
然而,当我sourceCpp
时,这会引发错误:
&#34;对zgetri_'
&#34;的未定义引用。如果我只用cx_mat
替换mat
,它会编译并正常工作,但它只适用于真实矩阵。使用inv()
会引发相同的编译错误。有趣的是,使用伪逆pinv()
传递编译,但结果与R&#39; solve()
相比会略有不同:
# include <RcppArmadillo.h>
// [[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()
处理复杂矩阵。感谢。
答案 0 :(得分:6)
这是一个已知问题如果您在使用Rlapack.so 进行R安装时使用RcppArmadillo,例如在Windows或某些RedHat系统上。
最好的答案是
我们有三张打开的门票at the RcppArmadillo repo(实际上我甚至添加了一份今天的列表the twelve missing complex functions,由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 <RcppArmadillo.h>
// [[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)
*/