Eigen入门之密集矩阵 8 - resharp slicing切片
簡(jiǎn)介
Eigen還沒有提供resharp或者slicing的處理函數(shù),但是,可以使用Map 類來實(shí)現(xiàn)這些功能。
實(shí)現(xiàn)resharp
操作Resharp及修改Matrix的維度大小,而其系數(shù)保持不變。Resharp時(shí),應(yīng)該返回一個(gè)對(duì)象,而保留原對(duì)象不變。
Eigen提供了示例.
MatrixXf M1(3,3); // Column-major storageM1 << 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;cout << endl;MatrixXf M1(2,6); // Column-major storageM1 << 1, 2, 3, 4, 5, 6,7, 8, 9, 10, 11, 12;Map<MatrixXf> M2(M1.data(), 6,2);cout << "M2:" << endl << M2 << endl;執(zhí)行結(jié)果:
v1: 1 4 7 2 5 8 3 6 9 v2: 1 2 3 4 5 6 7 8 9M2:1 47 102 58 113 69 12上面示例,從一個(gè)3X3的矩陣,創(chuàng)建得到了1X9的矩陣。后續(xù)的操作,將列優(yōu)先的2X6矩陣轉(zhuǎn)換,得到6X2的矩陣,需要注意它們?cè)趦?nèi)存中的系數(shù)的順序。
實(shí)現(xiàn)Slicing
切片slicing大致的操作如此: 在一個(gè)矩陣內(nèi),安裝一定的間隔,取得一組的行、或者列、或部分元素。
下面示例使用Map來模擬:
For instance, one can skip every P elements in a vector:
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;查看結(jié)果:
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也可以根據(jù)存儲(chǔ)順序,使用合適的outer-strider、inner-strider,來獲取矩陣的某些列。
這里先看一下Stride的定義:
可以看到,InnerStride是第一個(gè)參數(shù),作用于某種優(yōu)先存儲(chǔ)模式的優(yōu)先級(jí)上的實(shí)體,比如行優(yōu)先時(shí),作用于行上的實(shí)體;列優(yōu)先時(shí),作用于列實(shí)體。
而OuterStride作用于行矩陣的行或者列,如行優(yōu)先時(shí)作用于行,而列優(yōu)先時(shí),作用于列。
這是示例程序:
//matrix_sliding.cpp #include <iostream> #include <Eigen/Dense>using namespace std; using namespace Eigen;int main() {MatrixXf M1 = MatrixXf::Random(3,8);cout << "Column major input:" << endl << M1 << "\n";cout << "M1's outerStride: " << M1.outerStride() << " -- M1.cols(): " << M1.cols() << endl;Map<MatrixXf,0,OuterStride<> > M2(M1.data(), /*3*/ M1.rows(), /*3*/ (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";cout << "M3.outerStride(): " << M3.outerStride() << endl;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"; }執(zhí)行結(jié)果:
$ g++ -I /usr/local/include/eigen3 matrix_sliding.cpp -o matrix_sliding $ $ ./matrix_sliding Column major input:-0.999984 -0.0826997 -0.905911 0.869386 0.661931 0.0594004 -0.233169 0.373545-0.736924 0.0655345 0.357729 -0.232996 -0.930856 0.342299 -0.866316 0.1779530.511211 -0.562082 0.358593 0.0388328 -0.893077 -0.984604 -0.165028 0.860873 M1's outerStride: 3 -- M1.cols(): 8 1 column over 3: -0.999984 0.869386 -0.233169 -0.736924 -0.232996 -0.8663160.511211 0.0388328 -0.165028 Row major input:-0.999984 -0.0826997 -0.905911 0.869386 0.661931 0.0594004 -0.233169 0.373545-0.736924 0.0655345 0.357729 -0.232996 -0.930856 0.342299 -0.866316 0.1779530.511211 -0.562082 0.358593 0.0388328 -0.893077 -0.984604 -0.165028 0.860873 M3.outerStride(): 8 1 column over 3: -0.999984 0.869386 -0.233169 -0.736924 -0.232996 -0.8663160.511211 0.0388328 -0.165028示例里使用Outstride,M1是缺省的列優(yōu)先。M2映射M1得到,指定了OuterStride,取1個(gè)列,然后跳過2個(gè)列,得到新的矩陣。M1 --(Map)-->M2。
M3是指定了行優(yōu)先,拷貝M1構(gòu)建的矩陣,系數(shù)與M1相同。從M3 映射得到M4時(shí),指定了Stride<Dynamic,3>(M3.outerStride(),3),M3 --(Map)-->M4。
從輸出中,我們可以知道,在缺省未指定的情況下,Outstride的參數(shù)為其對(duì)應(yīng)的行(行優(yōu)先)或者列(列優(yōu)先)的元素?cái)?shù)量。如M1的OuterStride為3(每列3個(gè)元素),M3位8(每行8個(gè)列元素)。
總結(jié)
以上是生活随笔為你收集整理的Eigen入门之密集矩阵 8 - resharp slicing切片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曝理想汽车曾研发20万级车型!但“做着做
- 下一篇: 爱奇艺被老用户起诉 因限制投屏使用 相关