Как отмечено в комментариях, в 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)
*/
Это только для собственных значений, а не для собственных векторов.Извлечение собственных векторов не должно быть сложным.