Вычисление собственного вектора в C ++ - PullRequest
0 голосов
/ 23 октября 2018

Как я могу сделать функцию в cpp для вычисления первых "Q" собственных векторов матрицы M?

Я пытался использовать этот код, но не смог.

#include <RcppArmadillo.h>   

using namespace arma; 

 mat M;
 int Q;

 vec getEigen(M,Q) { 
 return eig_sym(M, Q);      
  }    

Сообщение об ошибке гласит:

"нет соответствующей функции для вызова" arma :: col (arma :: mat &, int &) "

Есть идеи? Я новичокна cpp и не знаю, что означает сообщение.

Спасибо

1 Ответ

0 голосов
/ 17 ноября 2018

Как отмечено в комментариях, в Armadillo нет функции, которая возвращает подмножество собственных значений.Тем не менее, можно объединить .head() или .tail() с eigen_sym(), чтобы извлечь подмножество.Кроме того, имеет смысл использовать reverse(), поскольку броненосец возвращает собственные значения в порядке возрастания.Для удобства я использую RcppArmadillo с атрибутами Rcpp здесь:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>   

// [[Rcpp::export]]
arma::vec getEigen(const arma::mat& M, int Q) { 
  return arma::reverse(arma::eig_sym(M).tail(Q));      
}

/*** R
set.seed(42)
N <- 10
m <- matrix(rnorm(N * N), N, N)
m <- m + t(m)
getEigen(m, N/2)
 */

Вывод при вызове Rcpp::sourceCpp в файле:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>   

// [[Rcpp::export]]
arma::vec getEigen(const arma::mat& M, int Q) { 
  return arma::reverse(arma::eig_sym(M).tail(Q));      
}

/*** R
set.seed(42)
N <- 10
m <- matrix(rnorm(N * N), N, N)
m <- m + t(m)
getEigen(m, N/2)
 */

Это только для собственных значений, а не для собственных векторов.Извлечение собственных векторов не должно быть сложным.

...