Расчет собственного вектора в переполнении стека

Как я могу сделать функцию в 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 и не знаю, что означает это сообщение.

Спасибо

0

Решение

Как отмечено в комментариях, в 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)
*/

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector