1

eigen2を使用し、行列 A を指定

a_0_0, a_0_1, a_0_2, ...
a_1_0, a_1_0, a_1_2, ...
...

および行列 B:

b_0_0, b_0_1, b_0_2, ...
b_1_0, b_1_1, b_1_2, ...
...

A と B の次元が同じ場合、行をインターリーブして次のように生成します。

a_0_0, a_0_1, a_0_2, ...
b_0_0, b_0_1, b_0_2, ...
a_1_0, a_1_0, a_1_2, ...
b_1_0, b_1_1, b_1_2, ...
...

明らかに、適切な次元の出力行列を作成し、各入力行列をループして要素を結果に割り当てる関数を作成できます。ただし、車輪の再発明はしたくないので、eigen2 がこの種の行列演算をエレガントに表現するメカニズムを既に持っている場合は、それを使用したいと思います。

私は eigen2 docs を調べましたが、明らかに正しいものは何もありませんでした。私が見つけた最も近いものはMatrixBase::selectでしたが、それは「aからの要素またはbからの要素」を行います。ここで、「aからの要素、次にbからの要素」が必要です。

高速パスでこれを行う必要はなく、初期化時にのみ行う必要があるため、効率は最優先事項ではありません。

行列を表現するためのより良い方法がある場合は、フォーマットについてお詫び申し上げます。

4

2 に答える 2

2

各 R x C 行列に、適切な対角線上の 0 と 1 で構成される 2R x R 行列を掛けてから加算します。

マトリックス 1

1 0 0 0 ...
0 0 0 0 ...
0 1 0 0 ...
0 0 0 0 ...

マトリックス 2

0 0 0 0 ...
1 0 0 0 ...
0 0 0 0 ...
0 1 0 0 ...
于 2011-12-22T18:03:16.853 に答える
0

これが Eigen3 に固有のものかどうかはわかりませんが、MapおよびStrideオブジェクトを使用して行をインターリーブできます。

MatrixXi C(A.rows()+B.rows(),A.cols());
Map<MatrixXi,0,Stride<Dynamic,2> >(C.data(),A.rows(),A.cols(),Stride<Dynamic,2>(2*A.rows(),2)) = A;
Map<MatrixXi,0,Stride<Dynamic,2> >(C.data()+1,B.rows(),B.cols(),Stride<Dynamic,2>(2*B.rows(),2)) = B;

ソース

于 2013-12-11T17:19:54.203 に答える