欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Eigen库学记10:理解矩阵存取的行主序与列主序 - 问题、限制及其应对策略

最编程 2024-02-20 14:21:42
...

3.1、使用限制

使用时发现还是不够方便,只能固定尺寸的矩阵可以指定行主序,或者列主序。
行主序和列主序一般使用时没有差别,都可以正常使用。当做数据1维读取的时候顺序就不一样了,如果有涉及该方面的计算就会得不到正确的结果。

3.2、解救办法

办法有两个,更推荐第二种做法,虽然第一种更简单。

3.2.1、等效原理解救办法

等效原理就是将举证转置然后按列获取与转置之前按行获取的结果是一样的。
使用transpose()
测试程序:

void test_transpose()
{
	double arr[9] = { 1,2,3,4,5,6,7,8,9 };
	MatrixXd A(3, 3);
	A << 1, 2, 3, 4, 5, 6, 7, 8, 9;
	//A.transpose();
	cout << "In memory (row-major): \n" << A << endl;
	for (int i = 0; i < A.size(); i++)
		cout << *(A.data() + i) << "  ";
	MatrixXd B = A.transpose();
	cout << "\nIn memory (row-major transpose): \n" << B << endl;
	for (int i = 0; i < B.size(); i++)
		cout << *(B.data() + i) << "  ";
	cout << endl;
}

程序输出:

In memory (row-major):
1 2 3
4 5 6
7 8 9
1  4  7  2  5  8  3  6  9
In memory (row-major transpose):
1 4 7
2 5 8
3 6 9
1  2  3  4  5  6  7  8  9

3.2.2、宏定义默认列优先改为行优先

typedef Matrix<double, Dynamic, Dynamic,RowMajor>rMatrixXd;//定义矩阵行优先
double arr[9]={1,2,3,4,5,6,7,8,9};
Map<rMatrixXd> A(arr,3,3);

输出:

1 2 3 4 5 6 7 8 9

说明这个是行主序的。
如果是列主序时输出的结果是:

1 4 7 2 4 8 3 6 9