我目前遇到有关用Rcpp计算特征值的问题。当使用Rcpp的eig_sym
时,我得不到与R的eigen
相同的结果,尽管在Armadillo的网页上说它应该提供相同的结果(例如http://gallery.rcpp.org/articles/armadillo-eigenvalues/)。
我将使用以下Rcpp函数(与在线提供的相同):
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec getEigenValues(arma::mat M) {
return arma::eig_sym(M);
}
并在使用以下代码行后:
library(Rcpp)
library(RcppArmadillo)
MM <- matrix(c(0.5055860,0.2093442,-0.1061261,
-0.3170091,0.5472850,-0.4170188,
0.29660273,-0.02383499,0.80188728),3,3)
sourceCpp("./getEigenValues.cpp")
getEigenValues(MM)
eigen(MM)$values
我明白了:
> getEigenValues(MM)
[,1]
[1,] 0.1410249
[2,] 0.6472190
[3,] 1.0665144
> eigen(MM)$values
[1] 0.6986485+0.2855979i 0.6986485-0.2855979i
[3] 0.4574612+0.0000000i
这种不一致来自哪里?在Rcpp命令中,虚部也完全丢失,这不会打扰我,因为我只对Real部分感兴趣。希望有人能赐教!
最好的祝福!
你的矩阵不对称,所以eig_sym
不正确。您可以将以下C ++代码与eig_gen
一起使用。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::cx_vec getEigenValues(arma::mat M) {
return arma::eig_gen(M);
}