Eigen常用函数以及注意事项总结
2015-10-19 11:21
399 查看
一、初始化一个矩阵
定义一个固定大小矩阵:
Matrix M;
例如:
Matrix M;//定义了一个四行五列的double型矩阵
定义一个动态矩阵
MatrixXd M(4,5);//定义了一个四行五列的double矩阵
Eigen定义了一些Macro例如
typedef Matrix Vector3f;
typedef Matrix RowVector2i;
typedef Matrix MatrixXd;
二、矩阵的赋值
1、重写了 << operator
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
2、逐个元素赋值
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
三、常用函数:
M.rows();//返回M行数
M.cols();//返回M列数
M.row(i);//返回第i行
M.col(j);//返回第j列
M.block<2,3>(1,2);//返回一个2x3的子块,从1行2列开始
M.block(i,j,r,c);//返回矩阵子块,i行j列开始rxc大小
M.size();//返回M元素个数,即row*col
M.resize(int ,int );//重置矩阵大小
注意:这里是dynamic-size matrix动态大小矩阵;
M.transpose();//矩阵的转置
M.conjugate();//共轭转置
M.adjoint();//伴随矩阵
注意:不能使用形如M=M.transpose();的赋值语句,会产生赋值错误(aliasing issue);
要写成:
M=M.transposInPlace();
类似的还有如下:
MatrixBase::adjoint()
MatrixBase::adjointInPlace()
DenseBase::reverse()
DenseBase::reverseInPlace()
DenseBase::transpose()
DenseBase::transposeInPlace()
相同大小矩阵可以+、-运算:
Matrix2d a;
a << 1, 2,
3, 4;
MatrixXd b(2,2);
b << 2, 3,
1, 4;
std::cout << "a + b =\n" << a + b << std::endl;
矩阵数乘或数除用*,/:
Matrix2d a;
a << 1, 2,
3, 4;
Vector3d v(1,2,3);
std::cout << "a * 2.5 =\n" << a * 2.5 << std::endl;
std::cout << "0.1 * v =\n" << 0.1 * v << std::endl;
v *= 2;
std::cout << "Now v =\n" << v << std::endl;
矩阵直接相乘用*,相当于MxN;
v.dot(w);//向量点乘
v.cross(w);//向量叉乘
Vector3d v(1,2,3);
Vector3d w(0,1,2);
cout << "Dot product: " << v.dot(w) << endl;
cout << "Cross product:\n" << v.cross(w) << endl;
一些常用的算法:
M.sum();//矩阵元素求和
M.prod();//矩阵元素求积
M.mean();//矩阵元素平均数
M.maxCoeff();//最大元素
M.minCoeff();//最小元素
注意:M.maxCoeff(&i,&j)可以将最大元素的位置赋值给i,j
M.trace();//矩阵的迹
#include
#include
using namespace std;
int main()
{
Eigen::Matrix2d mat;
mat << 1, 2,
3, 4;
cout << "Here is mat.sum(): " << mat.sum() << endl;
cout << "Here is mat.prod(): " << mat.prod() << endl;
cout << "Here is mat.mean(): " << mat.mean() << endl;
cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl;
cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl;
cout << "Here is mat.trace(): " << mat.trace() << endl;
}
Array类:Array的赋值、加法、减法也与Matrix类似,需要说明的是Array相乘,这个操作类似于Matlab中的".*",对应元素做计算,所以两个Array相乘,只能是大小相同的Array。
Array提供了一些操作函数,abs(),求每个元素的绝对值;sqrt(),求每个元素的算术平方根;a.min(b),求a和b中每个位置较小的元素a.cos(),a.sin()。
Matrix和Array可以进行互换,利用matrix中的Array()函数和Array中的Matrix()函数,例如:M.array()*N.array()等价于M与N中对应元素相乘。M.array()+4等价于M中每个元素+4,也就是:
初始化特殊矩阵函数:
1、Zero()函数
ArrayXf::Zero(3);
ArrayXXf::Zero(3, 4);
2、Constant()函数
Constant(rows, cols, value);
3、Random()函数
4、Identity()函数,初始化一个单位矩阵,只适用于Matrix不是用于Array
5、LinSpaced(size, low, high);//类似Matlab中1:9生成一个大小位size的数列
6、setZero()、setIdentity()、......
四、关于动态矩阵和静态矩阵
简单来说:能用静态矩阵就用静态矩阵,尤其是矩阵较小的时候;当你不得不采用动态矩阵的时候,用动态矩阵。对于16个元素以下的矩阵,采用静态矩阵表现更加出色。
Matrix4f mymatrix;
等价于:
float mymatrix[16];
而
MatrixXf mymatrix(rows,columns);
意味着:
float *mymatrix = newfloat[rows*columns];
定义一个固定大小矩阵:
Matrix M;
例如:
Matrix M;//定义了一个四行五列的double型矩阵
定义一个动态矩阵
MatrixXd M(4,5);//定义了一个四行五列的double矩阵
Eigen定义了一些Macro例如
typedef Matrix Vector3f;
typedef Matrix RowVector2i;
typedef Matrix MatrixXd;
二、矩阵的赋值
1、重写了 << operator
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
2、逐个元素赋值
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
三、常用函数:
M.rows();//返回M行数
M.cols();//返回M列数
M.row(i);//返回第i行
M.col(j);//返回第j列
M.block<2,3>(1,2);//返回一个2x3的子块,从1行2列开始
M.block(i,j,r,c);//返回矩阵子块,i行j列开始rxc大小
M.size();//返回M元素个数,即row*col
M.resize(int ,int );//重置矩阵大小
注意:这里是dynamic-size matrix动态大小矩阵;
M.transpose();//矩阵的转置
M.conjugate();//共轭转置
M.adjoint();//伴随矩阵
注意:不能使用形如M=M.transpose();的赋值语句,会产生赋值错误(aliasing issue);
要写成:
M=M.transposInPlace();
类似的还有如下:
MatrixBase::adjoint()
MatrixBase::adjointInPlace()
DenseBase::reverse()
DenseBase::reverseInPlace()
DenseBase::transpose()
DenseBase::transposeInPlace()
相同大小矩阵可以+、-运算:
Matrix2d a;
a << 1, 2,
3, 4;
MatrixXd b(2,2);
b << 2, 3,
1, 4;
std::cout << "a + b =\n" << a + b << std::endl;
矩阵数乘或数除用*,/:
Matrix2d a;
a << 1, 2,
3, 4;
Vector3d v(1,2,3);
std::cout << "a * 2.5 =\n" << a * 2.5 << std::endl;
std::cout << "0.1 * v =\n" << 0.1 * v << std::endl;
v *= 2;
std::cout << "Now v =\n" << v << std::endl;
矩阵直接相乘用*,相当于MxN;
v.dot(w);//向量点乘
v.cross(w);//向量叉乘
Vector3d v(1,2,3);
Vector3d w(0,1,2);
cout << "Dot product: " << v.dot(w) << endl;
cout << "Cross product:\n" << v.cross(w) << endl;
一些常用的算法:
M.sum();//矩阵元素求和
M.prod();//矩阵元素求积
M.mean();//矩阵元素平均数
M.maxCoeff();//最大元素
M.minCoeff();//最小元素
注意:M.maxCoeff(&i,&j)可以将最大元素的位置赋值给i,j
M.trace();//矩阵的迹
#include
#include
using namespace std;
int main()
{
Eigen::Matrix2d mat;
mat << 1, 2,
3, 4;
cout << "Here is mat.sum(): " << mat.sum() << endl;
cout << "Here is mat.prod(): " << mat.prod() << endl;
cout << "Here is mat.mean(): " << mat.mean() << endl;
cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl;
cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl;
cout << "Here is mat.trace(): " << mat.trace() << endl;
}
Array类:Array的赋值、加法、减法也与Matrix类似,需要说明的是Array相乘,这个操作类似于Matlab中的".*",对应元素做计算,所以两个Array相乘,只能是大小相同的Array。
Array提供了一些操作函数,abs(),求每个元素的绝对值;sqrt(),求每个元素的算术平方根;a.min(b),求a和b中每个位置较小的元素a.cos(),a.sin()。
Matrix和Array可以进行互换,利用matrix中的Array()函数和Array中的Matrix()函数,例如:M.array()*N.array()等价于M与N中对应元素相乘。M.array()+4等价于M中每个元素+4,也就是:
初始化特殊矩阵函数:
1、Zero()函数
ArrayXf::Zero(3);
ArrayXXf::Zero(3, 4);
2、Constant()函数
Constant(rows, cols, value);
3、Random()函数
4、Identity()函数,初始化一个单位矩阵,只适用于Matrix不是用于Array
5、LinSpaced(size, low, high);//类似Matlab中1:9生成一个大小位size的数列
6、setZero()、setIdentity()、......
四、关于动态矩阵和静态矩阵
简单来说:能用静态矩阵就用静态矩阵,尤其是矩阵较小的时候;当你不得不采用动态矩阵的时候,用动态矩阵。对于16个元素以下的矩阵,采用静态矩阵表现更加出色。
Matrix4f mymatrix;
等价于:
float mymatrix[16];
而
MatrixXf mymatrix(rows,columns);
意味着:
float *mymatrix = newfloat[rows*columns];
相关文章推荐
- Javascript 函数声明 的优先级 高于 变量声明的优先级,但 不会 覆盖变量赋值
- ACE_Reactor(二)ACE_Dev_Poll_Reactor
- 与符号表分离程序或动态库, 如何用GDB调试
- CoordinatorLayout
- 跳转语句
- C#可以自动在后台为属性创建字段
- oracle 第14章 表空间管理
- Nginx下载和编译安装
- 2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名
- Python六大开源框架对比
- 时间与日期处理【转载】
- HDU 2054 A == B ?
- ACE_Reactor(一)整体理解ACE_Reactor
- 对话框
- 内核简介
- <学习笔记>cas server + cas client 单点登录 原理介绍
- null
- linux apache 查看IP连接数
- html弹出提示showtoast
- 自定义控件 @IBDesignable @IBInspectable