Rcpp eig_sym 和 R 的本征不提供相同的结果
Rcpp eig_sym and R's eigen don't deliver the same result
我目前遇到有关使用 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 命令中也完全缺少虚数部分,这不会打扰我,因为我只对实数部分感兴趣。希望有人能赐教!
此致!
你的矩阵不对称,所以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);
}
我目前遇到有关使用 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 命令中也完全缺少虚数部分,这不会打扰我,因为我只对实数部分感兴趣。希望有人能赐教!
此致!
你的矩阵不对称,所以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);
}