RcppArmadillo:复杂矩阵逆编译错误
RcppArmadillo: Complex matrix inverse compilation error
我正在尝试使用 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
它时,这会引发错误:
"undefined reference to 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()
在复杂矩阵上工作。谢谢。
这是一个已知问题 如果您使用 Rlapack.so 将 RcppArmadillo 与 R 安装一起使用,例如在 Windows 或某些 RedHat 系统上。
最好的答案是
- 不使用 complex-valued Rlapack has some 中未包含的功能,但遗憾的是不是全部(但您可能别无选择)
- 重新配置 R 安装以使用完整的外部 liblapack.so
我们有三张公开票 at the RcppArmadillo repo (and in fact I even added one today listing the twelve missing complex functions 被 Armadillo 使用但在 Rlapack.so 中丢失了),我只是恳求 R Core 为 Rlapack 添加更多 complex-valued 功能。
为了强调第二点,您的示例在这里工作正常,因为我没有在 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)
*/
我正在尝试使用 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
它时,这会引发错误:
"undefined reference to 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()
在复杂矩阵上工作。谢谢。
这是一个已知问题 如果您使用 Rlapack.so 将 RcppArmadillo 与 R 安装一起使用,例如在 Windows 或某些 RedHat 系统上。
最好的答案是
- 不使用 complex-valued Rlapack has some 中未包含的功能,但遗憾的是不是全部(但您可能别无选择)
- 重新配置 R 安装以使用完整的外部 liblapack.so
我们有三张公开票 at the RcppArmadillo repo (and in fact I even added one today listing the twelve missing complex functions 被 Armadillo 使用但在 Rlapack.so 中丢失了),我只是恳求 R Core 为 Rlapack 添加更多 complex-valued 功能。
为了强调第二点,您的示例在这里工作正常,因为我没有在 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)
*/