首页 > 解决方案 > C++中的特征向量计算

问题描述

如何在 cpp 中创建函数以计算矩阵 M 的第一个“Q”特征向量?

我尝试使用此代码,但失败了。

#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 的新手,不知道消息的含义。

谢谢

标签: c++eigenvector

解决方案


如评论中所述,Armadillo 中没有返回特征值子集的函数。但是,可以组合.head()或提取子集。此外,使用 是有意义的,因为犰狳按升序返回特征值。为方便起见,我在这里使用带有Rcpp属性的 RcppArmadillo :.tail()eigen_sym()reverse()

// [[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)
 */

这仅适用于特征值,不适用于特征向量。不过,提取特征向量应该不难。


推荐阅读