原文:Eigen官網-Reshape and Slicing
Eigen並沒有爲matrix提供直接的Reshape和Slicing的API,但是這些特性可以通過Map類來實現。
1. Reshape
Reshape
操作在保持元素不變的情況下修改matrix的尺寸大小。該方法不需要修改輸入矩陣本身,而是使用類圖在存儲上創建一個不同的視圖。下面是創建矩陣一維線性視圖的典型示例:
示例如下:
MatrixXf M1(3,3); // Column-major storage
M1 << 1, 2, 3,
4, 5, 6,
7, 8, 9;
Map<RowVectorXf> v1(M1.data(), M1.size());
cout << "v1:" << endl << v1 << endl;
Matrix<float,Dynamic,Dynamic,RowMajor> M2(M1);
Map<RowVectorXf> v2(M2.data(), M2.size());
cout << "v2:" << endl << v2 << endl;
結果如下:
v1:
1 4 7 2 5 8 3 6 9
v2:
1 2 3 4 5 6 7 8 9
請注意:輸入矩陣的存儲順序和在線性視圖中元素的順序的不同。
如下是是一個將26矩陣映射爲62矩陣的示例:
示例如下:
MatrixXf M1(2,6); // Column-major storage
M1 << 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12;
Map<MatrixXf> M2(M1.data(), 6,2);
cout << "M2:" << endl << M2 << endl;
結果如下:
M2:
1 4
7 10
2 5
8 11
3 6
9 12
2. Slicing
切片包括獲取矩陣中的一組行、列或元素。同樣,Map允許輕鬆地模擬這個特性。
在vector中每隔p個元素選擇一個:
RowVectorXf v = RowVectorXf::LinSpaced(20,0,19);
cout << "Input:" << endl << v << endl;
Map<RowVectorXf,0,InnerStride<2> > v2(v.data(), v.size()/2);
cout << "Even:" << v2 << endl;
結果如下:
Input:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Even: 0 2 4 6 8 10 12 14 16 18
根據實際的存儲順序,可以使用適當的外部跨距或內部跨距將一個列取三個列:
MatrixXf M1 = MatrixXf::Random(3,8);
cout << "Column major input:" << endl << M1 << "\n";
Map<MatrixXf,0,OuterStride<> > M2(M1.data(), M1.rows(), (M1.cols()+2)/3, OuterStride<>(M1.outerStride()*3));
cout << "1 column over 3:" << endl << M2 << "\n";
typedef Matrix<float,Dynamic,Dynamic,RowMajor> RowMajorMatrixXf;
RowMajorMatrixXf M3(M1);
cout << "Row major input:" << endl << M3 << "\n";
Map<RowMajorMatrixXf,0,Stride<Dynamic,3> > M4(M3.data(), M3.rows(), (M3.cols()+2)/3,
Stride<Dynamic,3>(M3.outerStride(),3));
cout << "1 column over 3:" << endl << M4 << "\n";
結果如下:
Column major input:
0.68 0.597 -0.33 0.108 -0.27 0.832 -0.717 -0.514
-0.211 0.823 0.536 -0.0452 0.0268 0.271 0.214 -0.726
0.566 -0.605 -0.444 0.258 0.904 0.435 -0.967 0.608
1 column over 3:
0.68 0.108 -0.717
-0.211 -0.0452 0.214
0.566 0.258 -0.967
Row major input:
0.68 0.597 -0.33 0.108 -0.27 0.832 -0.717 -0.514
-0.211 0.823 0.536 -0.0452 0.0268 0.271 0.214 -0.726
0.566 -0.605 -0.444 0.258 0.904 0.435 -0.967 0.608
1 column over 3:
0.68 0.108 -0.717
-0.211 -0.0452 0.214
0.566 0.258 -0.967