【发布时间】:2016-01-03 05:19:23
【问题描述】:
我正在尝试使用 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 它时,这会引发错误:
“未定义对 zgetri_' 的引用”。如果我将cx_mat 替换为mat,它可以编译并正常工作,但它只适用于真实矩阵。使用 inv() 会引发相同的编译错误。有趣的是,使用伪逆pinv()通过编译,但结果与R的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() 处理复杂的矩阵。谢谢。
【问题讨论】:
-
您确定不想用 t(conjugate(mat)) 反转 mat 的乘积吗?我确实想知道是否提供更多信息、警告性的错误消息可能会有所帮助。
-
这是 OP 未显示的编译/链接失败。