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 文档,但没有什么明显正确的。我发现的最接近的东西是 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,但您可以使用MapStride对象交错行。

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 回答