赞
踩
MatrixXi a { // construct a 2x2 matrix
{1, 2}, // first row
{3, 4} // second row
};
Matrix<double, 2, 3> b {
{2, 3, 4},
{5, 6, 7},
};
#include <iostream>
#include "f:/learn/eigen-3.4.0/Eigen/Dense"
using Eigen::Matrix;
int main()
{
Matrix<int,3,2> a {{1, 2}, {3, 4}, {5, 6}};
std::cout << a<< std::endl;
}
1 2
3 4
5 6
Process returned 0 (0x0) execution time : 0.117 s
Press any key to continue.
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
1 2 3
4 5 6
7 8 9
#include <iostream>
#include "e:/eigen/Eigen/Dense"
using namespace std;
using namespace Eigen;
int main()
{
MatrixXf m(2,5);
cout << "The matrix m is of size "
<< m.rows() << "x" << m.cols() << std::endl;
m.resize(4,3);
cout << "The matrix m resized is of size "
<< m.rows() << "x" << m.cols() << std::endl;
cout << "It has " << m.size() << " coefficients" << std::endl;
VectorXf v(2);
cout << "The vector v is of size " << v.size() << std::endl;
v.resize(5);
cout << "The vector v resized is of size " << v.size() << std::endl;
cout << "As a matrix, v is of size "
<< v.rows() << "x" << v.cols() << std::endl;
}
The matrix m is of size 2x5
The matrix m resized is of size 4x3
It has 12 coefficients
The vector v is of size 2
The vector v resized is of size 5
As a matrix, v is of size 5x1
Process returned 0 (0x0) execution time : 0.317 s
Press any key to continue.
什么时候应该使用固定大小(例如Matrix4f),什么时候应该使用动态大小(例如MatrixXf)?
Matrix<typename Scalar,
int RowsAtCompileTime,
int ColsAtCompileTime,
int Options = 0,
int MaxRowsAtCompileTime = RowsAtCompileTime,
int MaxColsAtCompileTime = ColsAtCompileTime>
Matrix<float, 3, 3, RowMajor>
Matrix<float, Dynamic, Dynamic, 0, 3, 4>
8 2 2 9 9 1 4 4 3 5 4 5
8 9 3 2 1 5 2 4 4 9 4 5
3、例
定义一个4*3的矩阵A,然后分别以按行或按列存储。
使用PlainObjectBase::data()函数,该函数返回指向矩阵第一个条目的内存位置的指针。
#include <iostream>
#include "e:/eigen/Eigen/Dense"
using namespace std;
using namespace Eigen;
int main()
{
Matrix<int, 4, 3, ColMajor> Acolmajor;
Acolmajor << 1,2,3,4,
5,6,7,8,
9,10,11,12;
cout << "The matrix A:" << endl;
cout << Acolmajor << endl << endl;
cout << "In memory (column-major):" << endl;
for (int i = 0; i < Acolmajor.size(); i++)
cout << *(Acolmajor.data() + i) << " ";
cout << endl << endl;
Matrix<int, 4, 3, RowMajor> Arowmajor = Acolmajor;
cout << "In memory (row-major):" << endl;
for (int i = 0; i < Arowmajor.size(); i++)
cout << *(Arowmajor.data() + i) << " ";
cout << endl;
}
The matrix A:
1 2 3
4 5 6
7 8 9
10 11 12
In memory (column-major):
1 4 7 10 2 5 8 11 3 6 9 12
In memory (row-major):
1 2 3 4 5 6 7 8 9 10 11 12
Process returned 0 (0x0) execution time : 0.404 s
Press any key to continue.
Matrix类模板有六个模板参数,其中三个是强制性的(Scalar, RowsAtCompileTime和ColsAtCompileTime),另外三个是可选的(Options, MaxRowsAtCompileTime和MaxColsAtCompileTime)。如果Options参数设置为RowMajor,则矩阵或数组按行主要顺序存储;如果设置为ColMajor,则按列主顺序存储。该机制在上述特征程序中用于指定存储顺序。
如果未指定存储顺序,则Eigen默认以列为主的方式存储条目。如果使用方便类型(Matrix3f、ArrayXXd等)之一,也会出现这种情况。
使用一种存储顺序的矩阵和数组可以分配给使用另一种存储顺序的矩阵和数组,就像上面的程序中使用Acolmajor初始化Arowmajor时发生的那样。Eigen将自动重新排序条目。更一般地说,行为主矩阵和列为主矩阵可以在表达式中混合使用。
您应该在程序中使用哪种存储顺序呢?这个问题没有简单的答案;这取决于您的应用程序。以下是一些需要牢记的要点:
1.您的用户可能希望您使用特定的存储顺序。或者,您可以使用Eigen以外的其他库,这些库可能需要特定的存储顺序。在这些情况下,在整个程序中使用这种存储顺序可能是最简单和最快的。
2.当矩阵以行为主的顺序存储时,由于更好的数据局部性,逐行遍历矩阵的算法将运行得更快。类似地,对于列主矩阵,逐列遍历更快。为了找出适合您的特定应用程序的更快的方法,进行一些实验可能是值得的。
3.缺省情况下,Eigen是列为主的。自然地,大多数特征库的开发和测试都是用列主矩阵完成的。这意味着,尽管我们的目标是透明地支持列为主和行为主的存储顺序,但Eigen库可能最适合列为主的矩阵。
#include <iostream>
#include "f:/learn/eigen-3.4.0/Eigen/Dense"
using Eigen::VectorXd;
using Eigen::RowVectorXd;
int main()
{
VectorXd a {{1.5, 2.5, 3.5}};
RowVectorXd b {{1.0, 2.0, 3.0, 4.0}};
std::cout << a<< std::endl;
std::cout << b<< std::endl;
}
1.5
2.5
3.5
1 2 3 4
Process returned 0 (0x0) execution time : 0.110 s
Press any key to continue.
MatrixNt for Matrix<type, N, N>. For example, MatrixXi for Matrix<int, Dynamic, Dynamic>.
MatrixXNt for Matrix<type, Dynamic, N>. For example, MatrixX3i for Matrix<int, Dynamic, 3>.
MatrixNXt for Matrix<type, N, Dynamic>. For example, Matrix4Xd for Matrix<d, 4, Dynamic>.
VectorNt for Matrix<type, N, 1>. For example, Vector2f for Matrix<float, 2, 1>.
RowVectorNt for Matrix<type, 1, N>. For example, RowVector3d for Matrix<double, 1, 3>.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。