[size=large]Map类 是 矩阵库Eigen中用来将内存数据 映射为 任意形状的矩阵的类。
其基本用法参见:[url]http://cherishlc.iteye.com/blog/1968238[/url]
Map的官方文档:[url]http://eigen.tuxfamily.org/dox/group__TutorialMapClass.html[/url]
Stride类的官方文档:[url]http://eigen.tuxfamily.org/dox/classEigen_1_1Stride.html[/url]
这里给出其最为灵活的用法的一个示例:
将一个矩阵的第一行copy到另一个矩阵(要是Eigen有reshape函数就不用这么麻烦了。。。别说,还真有!可以用resize代替~~)
先上结果:[/size]
[img]http://dl2.iteye.com/upload/attachment/0101/1628/06f5ec6c-f6a2-3ccd-bfca-1752defbcd72.png[/img]
[size=large]附上代码:[/size]
其基本用法参见:[url]http://cherishlc.iteye.com/blog/1968238[/url]
Map的官方文档:[url]http://eigen.tuxfamily.org/dox/group__TutorialMapClass.html[/url]
Stride类的官方文档:[url]http://eigen.tuxfamily.org/dox/classEigen_1_1Stride.html[/url]
这里给出其最为灵活的用法的一个示例:
将一个矩阵的第一行copy到另一个矩阵(要是Eigen有reshape函数就不用这么麻烦了。。。别说,还真有!可以用resize代替~~)
先上结果:[/size]
[img]http://dl2.iteye.com/upload/attachment/0101/1628/06f5ec6c-f6a2-3ccd-bfca-1752defbcd72.png[/img]
[size=large]附上代码:[/size]
#include <Eigen/Core>
#include <iomanip>
#include <iostream>
using std::setw;
#define printlnExp(exp) std::cout<<std::left<<setw(30)<<(std::string(#exp)+" 为:")<<std::endl<<(exp)
#define printlnExpln(exp) printlnExp(exp)<<std::endl
void main() {
using namespace Eigen;
MatrixXd m (4, 6);
for (int i = 0; i < m.size(); ++i) {
m (i) = i;
}
printlnExpln (m);
MatrixXd msub (2, m.cols() / 2);
//将 m 的第一行存入 msub中。 Stride 的第一个参数为OuterStride,对于按列优先存储的矩阵来说,就是 列与列之间指针的差值; 第二个参数为InnerStride,即两个相邻元素 指针之间的差值
msub = Map<MatrixXd, 0, Stride<Dynamic, Dynamic> > (m.data(), msub.rows(), msub.cols(), Stride<Dynamic, Dynamic> (m.rows() * msub.rows(), m.rows() ) );
printlnExpln (msub);
//
MatrixXd msub2 = m.row (0);
msub2.resize (2, m.cols() / 2);//将resize函数作为reshape函数使用,可以达到同样的效果, 是不是觉着很爽啊~ 但是反过来,,,不可能用此方法去给m的第一行赋值
printlnExpln (msub2);
//
//以下方法显然是错的。。。
MatrixXd msub3 (2, m.cols() / 2);
msub3 = m.row (0);
printlnExpln (msub3) << std::endl;
std::cout << "以下是测试将m的第一行置为msub中的相反数" << std::endl << std::endl;
m.row (0) = -MatrixXd::Map (msub.data(), 1, m.cols() );
//m.row(0) = -Map<MatrixXd>(msub.data(), 1, m.cols());//这样写也行
printlnExpln (m);
}