Rcpp eig_sym и R eigen не дают одинакового результата - PullRequest
1 голос
/ 01 апреля 2019

В настоящее время я сталкиваюсь с проблемами, касающимися вычисления собственных значений с помощью 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, что не мешало бы мне, так как меня интересует только Реальная часть. Я надеюсь, что кто-то может просветить меня!

С наилучшими пожеланиями!

1 Ответ

4 голосов
/ 01 апреля 2019

Ваша матрица не симметрична, поэтому 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);
}
...