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);
	// 结论:赋值以后的矩阵为新的内存地址,对原矩阵的内容没有改变。
}

  

posted @ 2022-02-23 17:12  博客园—哆啦A梦  阅读(123)  评论(0)    收藏  举报