ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Eigen库学习笔记(十)矩阵存储顺序行优先与列优先

2022-01-02 13:34:09  阅读:449  来源: 互联网

标签:优先 顺序 Eigen 矩阵 存储 3.2 解救


Eigen库学习笔记(十)矩阵存储顺序行优先与列优先

1、存储顺序

对于矩阵和二维数组有两种存储方式,列优先和行优先。

假设矩阵:
在这里插入图片描述
按行优先存储,内存中形式如下:
8 2 2 9 9 1 4 4 3 5 4 5
列优先,内存格式:
8 9 3 2 1 5 2 4 4 9 4 5

官网示例:

Matrix<int, 3, 4, ColMajor> Acolmajor;
Acolmajor << 8, 2, 2, 9,
             9, 1, 4, 4,
             3, 5, 4, 5;
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, 3, 4, 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:
8 2 2 9
9 1 4 4
3 5 4 5

In memory (column-major):
8  9  3  2  1  5  2  4  4  9  4  5  

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

2、存储顺序及选择

Matrix类模板中可以设定存储的方向,RowMajor表示行优先,ColMajor表示列优先。默认是列优先。

如何选择存储方式呢?

1、如果要和其他库合作开发,为了转化方便,可以选择同样的存储方式。
2、应用中涉及大量行遍历操作,应该选择行优先,寻址更快。反之亦然。
3、默认是列优先,而且大多库都是按照这个顺序的,默认的不失为较好的。

参考:Storage orders

3、使用限制与解救办法

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

标签:优先,顺序,Eigen,矩阵,存储,3.2,解救
来源: https://blog.csdn.net/juluwangriyue/article/details/122274335

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有