当前位置:  开发笔记 > 运维 > 正文

RcppArmadillo:复杂矩阵逆编译错误

如何解决《RcppArmadillo:复杂矩阵逆编译错误》经验,为你挑选了1个好方法。

我试图使用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()处理复杂的矩阵.谢谢.



1> Dirk Eddelbu..:

如果您使用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)
*/

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有