- example 1
#include<iostream>
#include<Eigen/Dense>
//matrix
int main1()
{
Eigen::MatrixXd m(2, 2);
m(0, 0) = 1;
m(0, 1) = 2;
m(1, 0) = 3;
m(1, 1) = 4;
std::cout << "m= " << std::endl << m << std::endl;
return 0;
}
-
example2:任意矩陣VS固定矩陣
使用固定矩陣由兩大好處
1.因爲知道大小,所以編譯速度更快
2.在編譯的時候有更嚴格的參數檢查
推薦對4*4及更小的矩陣使用固定大小的矩陣和向量
int main2_1()
{
Eigen::MatrixXd m = Eigen::MatrixXd::Random(3, 3);//random values between -1 and 1
m = (m + Eigen::MatrixXd::Constant(3, 3, 1.2) )* 50;
std::cout << "m= " << std::endl << m << std::endl;
Eigen::VectorXd v(3);
v << 1, 2, 3;//comma-initializer,explained in Advanced initialization
std::cout << "m*v " << std::endl << m*v << std::endl;
return 0;
}
int main2_2()
{
Eigen::Matrix3d m = Eigen::Matrix3d::Random();
m = (m + Eigen::Matrix3d::Constant(1.2) )* 50;
std::cout << "m= " << std::endl << m << std::endl;
Eigen::Vector3d v(1,2,3);
std::cout << "m*v " << std::endl << m*v << std::endl;
return 0;
}
-
Matrix 類
在eigen中,所有的矩陣和向量都是Matrix模板類的對象
Matrix一個有6個模板參數,前三個是強制性的模板參數,後三個參數有默認值
Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
Scalar矩陣中元素的類型,可支持基本類型和自定義類型
RowsAtCompileTime、ColsAtCompileTime爲編譯時要知道的行或列的數值
Eigen實現了方便的類型定義以覆蓋常見的類,typedef Matrix<float, 4, 4> Matrix4f; -
向量是行或列爲1的矩陣,列爲1的矩陣更常用,列向量常用名column-vectors,just vectors
typedef Matrix<float, 3, 1> Vector3f
typedef Matrix<int, 1, 2> RowVector2i; -
特殊的動態值
Eigen支持在編譯時大小未知的矩陣,該類型的值在Eigen中稱爲dynamic size,相對編譯時大小已知的fixed size而言,
typedef Matrix<double, Dynamic, Dynamic> MatrixXd; -
構造器(構造函數)
通常使用默認的構造函數,不進行動態內存的分配也不初始化矩陣元素,eg.Matrix3f a;
僅分配空間,不進行初始化的構造函數,eg.MatrixXf a(10,15);
爲了對固定大小和動態大小的矩陣提供統一的API,固定大小的矩陣也可以使用該API,只是大小數值無效
對大小小於等於4的固定向量提供了可初始化參數的構造函數,Vector4d c(5.0, 6.0, 7.0, 8.0); -
元素訪問
對於矩陣,先傳入行索引,再傳入列索引;y也可採用單索引,單索引依賴在內存中的存儲順序,默認列優先存儲,但是也可以改爲行優先
對於向量,只傳入索引
僅向量可用[]取值操作,且每次最多取一個值。
因爲在C++編譯中,matrix[i,j]會被編譯爲matrix[j] -
逗號初始化
矩陣和向量都可以採用逗號初始化方法 -
Resizing
rows(), cols() and size()可分別獲得矩陣的行、列和元素數目,
resize()可動態對矩陣形狀進行轉化