有關eigen庫的一些基本使用方法

目錄

  • 介紹
    • 安裝
    • Demo
    • 矩陣、向量初始化
      • C++數組和矩陣轉換
      • 矩陣基礎操作
      • 點積和叉積
      • 轉置、伴隨、行列式、逆矩陣
      • 計算特征值和特征向量
      • 解線性方程
      • 最小二乘求解
      • 稀疏矩陣

介紹

Eigen是一個輕量級的矩陣庫,除了稀疏矩陣不成熟(3.1有較大改進)以外,其他的矩陣和向量操作都比較完善,而且速度不錯.

不支持vc6.0,vs最低版本支持2003(打補丁),最好是2005以上.

安裝

在eigen 3.1.3下載最新的版本,然后解壓文件,將解壓出來的文件夾下的\\Eigen\文件夾拷貝到程序文件夾下,包括頭文件,即可使用

Demo

eigendemo.zip

示例是vs2010環境下的程序,主要的文件就只有main.cpp和Eigen文件夾。

矩陣、向量初始化

#include <iostream>
#include "Eigen/Dense"
using namespace Eigen;
int main()
{MatrixXf m1(3,4);   //動態矩陣,建立3行4列。MatrixXf m2(4,3);	//4行3列,依此類推。MatrixXf m3(3,3);Vector3f v1;		//若是靜態數組,則不用指定行或者列/* 初始化 */Matrix3d m = Matrix3d::Random();m1 = MatrixXf::Zero(3,4);		//用0矩陣初始化,要指定行列數m2 = MatrixXf::Zero(4,3);m3 = MatrixXf::Identity(3,3);	//用單位矩陣初始化v1 = Vector3f::Zero();			//同理,若是靜態的,不用指定行列數m1 << 1,0,0,1,		//也可以以這種方式初始化1,5,0,1,0,0,9,1;m2 << 1,0,0,0,4,0,0,0,7,1,1,1;//向量初始化,與矩陣類似Vector3d v3(1,2,3);VectorXf vx(30);
}

C++數組和矩陣轉換

使用Map函數,可以實現Eigen的矩陣和c++中的數組直接轉換,語法如下:

//@param MatrixType 矩陣類型
//@param MapOptions 可選參數,指的是指針是否對齊,Aligned, or Unaligned. The default is Unaligned.
//@param StrideType 可選參數,步長
/*Map<typename MatrixType,int MapOptions,typename StrideType>
*/int i;//數組轉矩陣double *aMat = new double[20];for(i =0;i<20;i++){aMat[i] = rand()%11;}//靜態矩陣,編譯時確定維數 Matrix<double,4,5> Eigen:Map<Matrix<double,4,5> > staMat(aMat);//輸出for (int i = 0; i < staMat.size(); i++)std::cout << *(staMat.data() + i) << " ";std::cout << std::endl << std::endl;//動態矩陣,運行時確定 MatrixXdMap<MatrixXd> dymMat(aMat,4,5);//輸出,應該和上面一致for (int i = 0; i < dymMat.size(); i++)std::cout << *(dymMat.data() + i) << " ";std::cout << std::endl << std::endl;//Matrix為列優先,如下返回指針dymMat.data();

矩陣基礎操作

eigen重載了基礎的+ - * / += -= *= /= *可以表示標量和矩陣或者矩陣和矩陣

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{//單個取值,單個賦值double value00 = staMat(0,0);double value10 = staMat(1,0);staMat(0,0) = 100;std::cout << value00 <<value10<<std::endl;std::cout <<staMat<<std::endl<<std::endl;//加減乘除示例 Matrix2d 等同于 Matrix<double,2,2>Matrix2d a;a << 1, 2,3, 4;MatrixXd b(2,2);b << 2, 3,1, 4;Matrix2d c = a + b;std::cout<< c<<std::endl<<std::endl;c = a - b;std::cout<<c<<std::endl<<std::endl;c = a * 2;std::cout<<c<<std::endl<<std::endl;c = 2.5 * a;std::cout<<c<<std::endl<<std::endl;c = a / 2;std::cout<<c<<std::endl<<std::endl;c = a * b;std::cout<<c<<std::endl<<std::endl;

點積和叉積

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{//點積、叉積(針對向量的)Vector3d v(1,2,3);Vector3d w(0,1,2);std::cout<<v.dot(w)<<std::endl<<std::endl;std::cout<<w.cross(v)<<std::endl<<std::endl;
}
*/

轉置、伴隨、行列式、逆矩陣

小矩陣(4 * 4及以下)eigen會自動優化,默認采用LU分解,效率不高

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{Matrix2d c;c << 1, 2,3, 4;//轉置、伴隨std::cout<<c<<std::endl<<std::endl;std::cout<<"轉置\n"<<c.transpose()<<std::endl<<std::endl;std::cout<<"伴隨\n"<<c.adjoint()<<std::endl<<std::endl;//逆矩陣、行列式std::cout << "行列式: " << c.determinant() << std::endl;std::cout << "逆矩陣\n" << c.inverse() << std::endl;
}

計算特征值和特征向量

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{//特征向量、特征值std::cout << "Here is the matrix A:\n" << a << std::endl;SelfAdjointEigenSolver<Matrix2d> eigensolver(a);if (eigensolver.info() != Success) abort();std::cout << "特征值:\n" << eigensolver.eigenvalues() << std::endl;std::cout << "Here's a matrix whose columns are eigenvectors of A \n"<< "corresponding to these eigenvalues:\n"<< eigensolver.eigenvectors() << std::endl;
}

解線性方程

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{//線性方程求解 Ax =B;Matrix4d A;A << 2,-1,-1,1,1,1,-2,1,4,-6,2,-2,3,6,-9,7;Vector4d B(2,4,4,9);Vector4d x = A.colPivHouseholderQr().solve(B);Vector4d x2 = A.llt().solve(B);Vector4d x3 = A.ldlt().solve(B);	std::cout << "The solution is:\n" << x <<"\n\n"<<x2<<"\n\n"<<x3 <<std::endl;
}

除了colPivHouseholderQr、LLT、LDLT,還有以下的函數可以求解線性方程組,請注意精度和速度:?解小矩陣(4*4)基本沒有速度差別

DecompositionMethod矩陣特殊要求速度精度
PartialPivLUpartialPivLu()可逆+++
FullPivLUfullPivLu()None-+++
HouseholderQRhouseholderQr()None+++
ColPivHouseholderQRcolPivHouseholderQr()None+++
FullPivHouseholderQRfullPivHouseholderQr()None-+++
LLTllt()正定++++
LDLTldlt()正或負半定 Positive or negative semidefinite+++++

最小二乘求解

最小二乘求解有兩種方式,jacobiSvd或者colPivHouseholderQr,4*4以下的小矩陣速度沒有區別,jacobiSvd可能更快,大矩陣最好用colPivHouseholderQr

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{MatrixXf A1 = MatrixXf::Random(3, 2);std::cout << "Here is the matrix A:\n" << A1 << std::endl;VectorXf b1 = VectorXf::Random(3);std::cout << "Here is the right hand side b:\n" << b1 << std::endl;//jacobiSvd 方式:Slow (but fast for small matrices)std::cout << "The least-squares solution is:\n"<< A1.jacobiSvd(ComputeThinU | ComputeThinV).solve(b1) << std::endl;//colPivHouseholderQr方法:faststd::cout << "The least-squares solution is:\n"<< A1.colPivHouseholderQr().solve(b1) << std::endl;
}

稀疏矩陣

稀疏矩陣的頭文件包括:

  #include <Eigen/SparseCore>#include <Eigen/SparseCholesky>#include <Eigen/IterativeLinearSolvers>#include <Eigen/Sparse>

初始化有兩種方式: 1.使用三元組插入

typedef Eigen::Triplet<double> T;
std::vector<T> tripletList;
triplets.reserve(estimation_of_entries); //estimation_of_entries是預估的條目
for(...)
{tripletList.push_back(T(i,j,v_ij));//第 i,j個有值的位置的值
}
SparseMatrixType mat(rows,cols);
mat.setFromTriplets(tripletList.begin(), tripletList.end());
// mat is ready to go!

2.直接將已知的非0值插入

SparseMatrix<double> mat(rows,cols);
mat.reserve(VectorXi::Constant(cols,6));
for(...)
{// i,j 個非零值 v_ij != 0mat.insert(i,j) = v_ij;
}
mat.makeCompressed(); // optional

稀疏矩陣支持大部分一元和二元運算:

sm1.real() sm1.imag() -sm1 0.5*sm1
sm1+sm2 sm1-sm2 sm1.cwiseProduct(sm2)

二元運算中,稀疏矩陣和普通矩陣可以混合使用

//dm表示普通矩陣
dm2 = sm1 + dm1;

也支持計算轉置矩陣和伴隨矩陣

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258796.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258796.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258796.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

匯編程序:將字符串中所有大寫字符轉為小寫

【任務】 編寫程序&#xff0c;將數據區中定義的以0作為結束符的一個字符串中所有的大寫字符&#xff0c;全部轉換為小寫。 【參考解答】 assume cs:cseg, ds:dseg, ss:sseg sseg segment stackdw 100h dup (?) sseg ends dseg segmentdb YanTai123University, 0 d…

從零開始編寫自己的C#框架(1)——前言

記得十五年前自學編程時&#xff0c;拿著C語言厚厚的書&#xff0c;想要上機都不知道要用什么編譯器來執行書中的例子。十二年前在大學自學ASP時&#xff0c;由于身邊沒有一位同學和朋友學習這種語言&#xff0c;也只能整天混在圖收館里拼命的啃書。而再后來也差不多&#xff0…

Bash內置命令

Bash有很多內置命令&#xff0c;因為這些命令是內置的&#xff0c;因此bash不需要在磁盤上為它們定位&#xff0c;執行速度更快。 1&#xff09;列出所有內置命令列表$enable 2&#xff09;關閉內置命令test$enable -n test 3&#xff09;打開內置命令test$enable test 4&…

postman調用webservice接口_接口對前后端和測試的意義

1.什么是接口&#xff1f;接口測試主要用于外部系統與系統之間以及內部各個子系統之間的交互點&#xff0c;定義特定的交互點&#xff0c;然后通過這些交互點來&#xff0c;通過一些特殊的規則也就是協議&#xff0c;來進行數據之間的交互。2.接口都有哪些類型&#xff1f;接口…

基于代數距離的橢圓擬合

問題 給定離散點集Xi(xi,yi),i1,2,...NX_i(x_i,y_i) ,i1,2,...NXi?(xi?,yi?),i1,2,...N&#xff0c;我們希望找到誤差最小的橢圓去擬合這些離散點。 方法 由于橢圓的形式可以給定&#xff0c; 自然我們將使用最小二乘法來求解橢圓。主要依據論文《Direct least squares f…

Java與C語言比較(Java參考書中摘錄)

C語言為面向過程的編程語言&#xff0c;Java為面向對象的編程語言。 在面向過程的編程語言(如C語言)中&#xff0c;編程一般面向操作&#xff0c;編程單位是函數(在Java中函數稱為方法)。 在Java中&#xff0c;編程單位是類。最終實例化(即創建)這些類而得到對象&#xff0c;屬…

Android調試技巧之Eclipse行號和Logcat

很多初入Android的開發者可能會發現經常遇到Force Close或ANR這樣的問題&#xff0c;一般我們通過Android系統的錯誤日志打印工具Logcat可以看到出錯的內容&#xff0c;今天一起來說下如何通過 Eclipse行號和Logcat捕捉出錯點&#xff0c;我們遇到錯誤可以首先在Eclipse的DDMS中…

第六章 產權市場

《市場經濟概論》&#xff08;6&#xff09;產權市場一 第六章 產權市場 產權是指人們對于某種資產所擁有的所有權、占有權、支配權、使用權。產權市場是指人們對于某種資產所擁有的所有權、占有權、支配權、使用權進行有償轉讓的場所領域及其有關各方面相互關系的總和。在過去…

js打開本地文件夾_vue + ArcGIS 地圖應用系列一:arcgis api本地部署(開發環境)

1. 下載 ArcGIS API for JavaScript 官網地址&#xff1a; https://developers.arcgis.com/javascript/3/ 下載地址&#xff1a;http://links.esri.com/javascript-api/latest-download需要穩定的網絡環境注冊賬號后才可以下載下載完成后解壓文件&#xff0c;文件比較大可能需要…

基于幾何距離的橢圓擬合

問題 給定離散點集Xi(xi,yi)X_i(x_i,y_i)Xi?(xi?,yi?)&#xff0c;我們希望找到最好的橢圓去擬合這些離散點。 方法 通常我們使用最小二乘法求解如下的最優化問題&#xff1a; Min∑i1Nf(xi,E)2Min \sum_{i1}^N f(x_i,E)^2 Mini1∑N?f(xi?,E)2 這里f(xi,E)f(x_i,E)f(xi…

Generate Parentheses

題目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 方法…

ReportViewer 2010 打印預覽,用鼠標快速切換顯示比例時報錯:存儲空間不足,不能處理此命令...

CreateCompatibleDIB 存儲空間不足 無法處理此命令 安裝 ReportViewer 2010 sp1 即可。轉載于:https://www.cnblogs.com/runliuv/p/3640856.html

貪心/二分查找 BestCoder Round #43 1002 pog loves szh II

題目傳送門 1 /*2 貪心/二分查找&#xff1a;首先對ai%p&#xff0c;然后sort&#xff0c;這樣的話就有序能使用二分查找。貪心的思想是每次找到一個aj使得和為p-1(如果有的話)3 當然有可能兩個數和超過p&#xff0c;那么an的值最優&#xff0c;每次還要和…

nohup命令輸出日志_逼格高又實用的Linux高級命令,開發運維都要懂

在運維的坑里摸爬滾打好幾年了&#xff0c;我還記得我剛開始的時候&#xff0c;我只會使用一些簡單的命令&#xff0c;寫腳本的時候&#xff0c;也是要多簡單有多簡單&#xff0c;所以有時候寫出來的腳本又長又臭&#xff0c;像一些高級點的命令&#xff0c;比如說Xargs 命令、…

JavaScript中OOP——面向對象中的繼承/閉包

前 言 OOP JavaScript中OOP——>>>面向對象中的繼承/閉包 1.1面向對象的概念 使用一個子類繼承另一個父類&#xff0c;子類可以自動擁有父類的屬性和方法。>>> 繼承的兩方&#xff0c;發生在兩個類之間。1.2JS模擬實現繼承的三種方式&#xff1a; 首先&am…

js常用字符串函數

這些東西是以前整理的&#xff0c;放到這里&#xff0c;有需要的可以看看~挺全的~ /** * anchor()方法 * 在對象中的指定文本兩端放置一個有Name屬性的HTML錨點 * strVariable.anchor(anchorString) anchorString為錨點名稱 * 它本身不會檢查其他的ahchor錨點是否有name指…

c++11中的智能指針

在C11中有四種智能指針&#xff0c;auto_ptr&#xff0c;shared-ptr&#xff0c;unique_ptr和weak-ptr&#xff0c;其中auto_ptr有許多不足之處&#xff0c;在C11中已經建議廢棄使用。 1. shared_ptr std::shared_ptr智能指針可以通過共享指向對象的所有權&#xff0c;從而實現…

ubuntu14.04設置靜態IP

啊&#xff0c;最近懶惰了&#xff0c;好久沒有寫博客了。 一般機器啟動的時候會自動從DHCP服務器上面獲取動態IP地址&#xff0c;這是一件很方便的事情&#xff0c;可以不用手動設置網絡相關的蠶參數&#xff0c;但是有時候還是需要機器固定IP地址的。 第一步&#xff0c;編輯…

高中學歷python培訓靠譜嗎_高中學歷學完Python就能干人工智能?

最近Python大熱&#xff0c;主要是人工智能的熱度&#xff0c;昨天后院活動部介紹了一位女網友為男朋友選擇Java還是Python&#xff0c;大量的程序員熱議&#xff0c;也有人詢問如何學習Python&#xff0c;比如這位網友詢問高中學歷學習Python是不是就能干人工智能。兄弟&#…

curl+個人證書(又叫客戶端證書)訪問https站點

目前&#xff0c;大公司的OA管理系統&#xff08;俗稱內網&#xff09;&#xff0c;安全性要求較高&#xff0c;通常采用https的雙向 認證模式。 首先&#xff0c;什么是https&#xff0c;簡單的說就是在SSL協議之上實現的http協議&#xff08;get、post等操作&#xff09;。更…