eigen 合并 地址映射验证
注意:
1. 矩阵直接赋值的时候,不用申明被复制矩阵的维度,但是矩阵组合的时候,必须设置维度,通过维度确认合并的方式
2. 矩阵赋值等都是重新分配空间,改变对原地址没有影响
#include <iostream>
#include "Eigen/Dense"
using namespace std;
using namespace Eigen;
typedef Matrix<int, Dynamic, Dynamic,RowMajor> MatrixTypeInt;
typedef Map<MatrixTypeInt> MapTypeInt;
typedef Map<const MatrixTypeInt> MapTypeConstInt; // a read-only map
void PrintArray(int *d, int m, int n)
{
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout<< d[j + i * n] << " ";
}
cout << endl;
}
}
int main()
{
int data[] = {1,2,3,4,5,6,7,8,9};
int tmpN1 = 2;
int tmpN2 = 4;
// 1. 两种矩阵定义
MatrixTypeInt tmp1(tmpN1, tmpN2);
tmp1.setIdentity();
cout<< "生成固定矩阵:\n" << tmp1 <<endl;
MapTypeInt tmpMapInt(data, tmpN1, tmpN2); // m2map shares data with m2
cout<< "地址映射的矩阵:\n" << tmpMapInt << endl;
cout<< "地址映射的矩阵(extra): \n" << MapTypeInt(data, tmpN1, tmpN2)<<endl; // 另一种直接动态定义后输出,不用定义变量
// 2. 修改矩阵元素,然后在输出地址的元素
tmpMapInt(1, 1) = 10;
cout<< "改变其中一个元素:\n" << tmpMapInt << endl;
cout<< "改变其中一个元素(数组输出):\n";
PrintArray(data, 2, 4);
// 3. 将连个矩阵组合,形成新的矩阵
Matrix<int, Dynamic, Dynamic> coupleM1;
coupleM1.resize(2, 8); // 在进行矩阵组合前,必须要对矩阵分配组合后的大小,否则运行时出错
coupleM1 << tmpMapInt, tmp1;
cout<< "组合以后的矩阵1:\n" << coupleM1 << endl;
Matrix<int, Dynamic, Dynamic> coupleM2;
coupleM2.resize(4, 4); // 在进行矩阵组合前,必须要对矩阵分配组合后的大小,否则运行时出错
coupleM2 << tmpMapInt, tmp1;
cout<< "组合以后的矩阵2:\n" << coupleM2 << endl;
// 4. 对组合后的矩阵数值进行修改,查看源有矩阵是否变化
coupleM2(0, 2) = 11;
cout<< "改变其中一个元素后的矩阵(组合):\n" << coupleM2 << endl;
cout<< "改变其中一个元素(原矩阵):\n" << tmpMapInt << endl;
cout<< "改变其中一个元素(数组输出):\n";
PrintArray(data, 2, 4);
// 结论: 组合后的矩阵为新分配的地址,对原矩阵内容没有改变
// 5. 将组合矩阵中的模块直接赋值给地址映射的矩阵,参开结果
tmpMapInt = coupleM2.block(0, 0, 2, 4);
cout<< "提取block之后(矩阵):\n" << tmpMapInt << endl;
cout<< "提取block之后(数组输出):\n";
PrintArray(data, 2, 4);
// 结论: 通过为映射矩阵辅助block的方式,可修改对应地质的值。
// 6. 将矩阵赋值给另一个矩阵,然后修改复制后的矩阵
Matrix<int, Dynamic, Dynamic> tmpqqq = tmpMapInt; // 矩阵直接赋值的时候,不用申明被复制矩阵的维度,但是矩阵组合的时候,必须设置维度,通过维度确认合并的方式
tmpqqq(1, 3) = 99;
cout<< "赋值(矩阵):\n" << tmpqqq << endl;
cout<< "赋值(原矩阵矩阵):\n" << tmpMapInt << endl;
cout<< "赋值(数组输出):\n";
PrintArray(data, 2, 4);
// 结论:赋值以后的矩阵为新的内存地址,对原矩阵的内容没有改变。
}
记录每天生活的点点滴滴,呵呵呵呵呵呵

浙公网安备 33010602011771号