C++ Eigen库计算矩阵特征值及特征向量

本文主要讲解利用Eigen库计算矩阵的特征值及特征向量并与Matlab计算结果进行比较。

C++Eigen库代码

#include <iostream>
#include <Eigen/Dense>
#include <Eigen/Eigenvalues>
using namespace Eigen;
using namespace std;

void Eig()
{
 Matrix3d A;
 A << 1, 2, 3, 4, 5, 6, 7, 8, 9;
 cout << "Here is a 3x3 matrix, A:" << endl << A << endl << endl;
 EigenSolver<Matrix3d> es(A);

 Matrix3d D = es.pseudoEigenvalueMatrix();
 Matrix3d V = es.pseudoEigenvectors();
 cout << "The pseudo-eigenvalue matrix D is:" << endl << D << endl;
 cout << "The pseudo-eigenvector matrix V is:" << endl << V << endl;
 cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << endl;
}
int main()
{

 Eig();

}

计算结果:

最大最小特征值及其索引位置

//maxCoeff
//minCoeff

int col_index, row_index;
cout << D.maxCoeff(&row_index, &col_index) << endl;
cout << row_index << " " << col_index << endl;

Matlab 代码

clear all
clc
A = [1 2 3;4 5 6;7 8 9]
[V,D] = eig(A)

Matlab计算结果

使用sort()函数对特征值排序

主成份分析以及许多应用时候,需要对特征值大小排列。

A = magic(6);
[V,D] = eig(A)
[D_S,index] = sort(diag(D),'descend')
V_S = V(:,index)

结果

V =

 0.4082 -0.2887 0.4082 0.1507 0.4714 -0.4769
 0.4082 0.5774 0.4082 0.4110 0.4714 -0.4937
 0.4082 -0.2887 0.4082 -0.2602 -0.2357 0.0864
 0.4082 0.2887 -0.4082 0.4279 -0.4714 0.1435
 0.4082 -0.5774 -0.4082 -0.7465 -0.4714 0.0338
 0.4082 0.2887 -0.4082 0.0171 0.2357 0.7068

D =

 111.0000   0   0   0   0   0
   0 27.0000   0   0   0   0
   0   0 -27.0000   0   0   0
   0   0   0 9.7980   0   0
   0   0   0   0 -0.0000   0
   0   0   0   0   0 -9.7980

D_S =

 111.0000
 27.0000
 9.7980
 -0.0000
 -9.7980
 -27.0000

V_S =

 0.4082 -0.2887 0.1507 0.4714 -0.4769 0.4082
 0.4082 0.5774 0.4110 0.4714 -0.4937 0.4082
 0.4082 -0.2887 -0.2602 -0.2357 0.0864 0.4082
 0.4082 0.2887 0.4279 -0.4714 0.1435 -0.4082
 0.4082 -0.5774 -0.7465 -0.4714 0.0338 -0.4082
 0.4082 0.2887 0.0171 0.2357 0.7068 -0.4082

结语

本人是在实验中利用Eigen库求取最小特征值对应特征向量做PCA分析时使用,曾经再不知道有Eigen库的情况下自己写过矩阵相关运算的模板类,现在接触到Eigen库,就把困扰过自己的问题今天做一个小小总结。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 利用C++实现矩阵的相加/相称/转置/求鞍点

    1.矩阵相加 两个同型矩阵做加法,就是对应的元素相加. 复制代码 代码如下: #include<iostream>using namespace std;int main(){ int a[3][3]={{1,2,3},{6,5,4},{4,3,2}}; int b[3][3]={{4,3,2},{6,5,4},{1,2,3}}; int c[3][3]={0,0,0,0,0,0,0,0,0}; int i,j; cout<<"Array A:"<<

  • C++实现矩阵原地转置算法

    本文实例描述了C++实现矩阵原地转置算法,是一个非常经典的算法,相信对于学习C++算法的朋友有很大的帮助.具体如下: 一.问题描述 微软面试题:将一个MxN的矩阵存储在一个一维数组中,编程实现矩阵的转置. 要求:空间复杂度为O(1) 二.思路分析 下面以一个4x2的矩阵A={1,2,3,4,5,6,7,8}进行分析,转置过程如下图: 图中右下角的红色数字表示在一维数组中的下标.矩阵的转置其实就是数组中元素的移动,具体的移动过程如下图: 我们发现,这些移动的元素的下标是一个个环,下标1的元素移动到

  • C++ Eigen库计算矩阵特征值及特征向量

    本文主要讲解利用Eigen库计算矩阵的特征值及特征向量并与Matlab计算结果进行比较. C++Eigen库代码 #include <iostream> #include <Eigen/Dense> #include <Eigen/Eigenvalues> using namespace Eigen; using namespace std; void Eig() { Matrix3d A; A << 1, 2, 3, 4, 5, 6, 7, 8, 9; c

  • numpy求矩阵的特征值与特征向量(np.linalg.eig函数用法)

    目录 求矩阵的特征值与特征向量(np.linalg.eig) 语法 功能 Parameters Returns Raises Ralated Function: Notes Examples 总结 求矩阵的特征值与特征向量(np.linalg.eig) 语法 np.linalg.eig(a) 功能 Compute the eigenvalues and right eigenvectors of a square array. 求方阵(n x n)的特征值与右特征向量 Parameters a

  • numpy.linalg.eig() 计算矩阵特征向量方式

    在PCA中有遇到,在这里记录一下 计算矩阵的特征值个特征向量,下面给出几个示例代码: 在使用前需要单独import一下 >>> from numpy import linalg as LA >>> w, v = LA.eig(np.diag((1, 2, 3))) >>> w; v array([ 1., 2., 3.]) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>>

  • C++应用Eigen库对应实现matlab中部分函数问题

    目录 将Eigen加入到项目中 使用Eigen中函数及功能 问题及解决方式 注意事项 总结 将Eigen加入到项目中 1.如下图将Eigen库文件夹加入到项目目录中. 2.将Eigen文件加入到运行环境变量中 3.在项目头文件中包含Eigen. 使用Eigen中函数及功能 1)声明矩阵,向量,数组: 图中声明了一个2x3的矩阵,矩阵中数据类型为float. 第一个参数为矩阵中数据类型,第二参数为行数,第三为列数. 当参数为Dynamic时为动态,程序会自动检测需要设置XxX矩阵. 2)矩阵赋值

  • Python的numpy库中将矩阵转换为列表等函数的方法

    这篇文章主要介绍Python的numpy库中的一些函数,做备份,以便查找. (1)将矩阵转换为列表的函数:numpy.matrix.tolist() 返回list列表 Examples >>> >>> x = np.matrix(np.arange(12).reshape((3,4))); x matrix([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> x.tolist() [[0, 1, 2

  • Python计算矩阵的和积的实例详解

    python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包. 一.numpy的导入和使用 from numpy import *;#导入numpy的库函数 import numpy as np; #这个方式使用numpy的函数时,需要以np.开头. 二.矩阵的创建 由一维或二维数据创建矩阵 from numpy import *; a1=array([1,2,3]); a1=mat(a1); 创建常见的矩阵 data1=mat(zeros((3,3)));

  • R语言技巧Rcpp与Eigen库之间的相互转换

    当我们在使用Rcpp时,进行矩阵运算最简单的是使用Eigen库进行相关操作,可以很轻松地讲R中向量化与矩阵化的思想应用到C++代码上,从而对代码进行加速.可参考前面的博客:利用RcppEigen进行矩阵运算. 但有时,我们却必须使用Rcpp进行DataFrame,List等对象格式的处理.或者如果我们涉及到缺失值的处理,也需要使用Rcpp中的函数来做. 所以,如何在两种矩阵或向量格式,NumericVector/Matrix与VectorXd/MatrixXd之间相互转化就变得非常重要. 我们可

  • Python Numpy实现计算矩阵的均值和标准差详解

    目录 一.前言 二.详解计算均值和标准差 三.实践:CRITIC权重法计算变异系数 一.前言 CRITIC权重法是一种比熵权法和标准离差法更好的客观赋权法: 它是基于评价指标的对比强度和指标之间的冲突性来综合衡量指标的客观权重.考虑指标变异性大小的同时兼顾指标之间的相关性,并非数字越大就说明越重要,完全利用数据自身的客观属性进行科学评价. 对比强度是指同一个指标各个评价方案之间取值差距的大小,以标准差的形式来表现.标准差越大,说明波动越大,即各方案之间的取值差距越大,权重会越高: 指标之间的冲突

  • Python中shape计算矩阵的方法示例

    本文实例讲述了Python中shape计算矩阵的方法.分享给大家供大家参考,具体如下: 看到机器学习算法时,注意到了shape计算矩阵的方法接下来就讲讲我的理解吧 >>> from numpy import * >>> import operator >>> a =mat([[1,2,3],[5,6,9]]) >>> a matrix([[1, 2, 3], [5, 6, 9]]) >>> shape(a) (2,

  • C#计算矩阵的逆矩阵方法实例分析

    本文实例讲述了C#计算矩阵的逆矩阵方法.分享给大家供大家参考.具体如下: 1.代码思路 1)对矩阵进行合法性检查:矩阵必须为方阵 2)计算矩阵行列式的值(Determinant函数) 3)只有满秩矩阵才有逆矩阵,因此如果行列式的值为0(在代码中以绝对值小于1E-6做判断),则终止函数,报出异常 4)求出伴随矩阵(AdjointMatrix函数) 5)逆矩阵各元素即其伴随矩阵各元素除以矩阵行列式的商 2.函数代码 (注:本段代码只实现了一个思路,可能并不是该问题的最优解) /// <summary

随机推荐