给定两个动态的rxc矩阵,我如何交错行来产生一个2rxc矩阵

Given two dynamic R x C matrixes, how can I interleave the rows to produce one 2R x C matrix?

本文关键字:矩阵 何交错 2rxc 一个 动态 两个 rxc      更新时间:2023-10-16

使用特征2,给定矩阵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已经有一种机制来优雅地表达这种矩阵手术,我更愿意使用它。

我确实看了特征文档,没有什么明显正确的。我发现最接近的东西是MatrixBase::select,但这确实'元素从a或元素从b',我想要的是'元素从a然后元素从b在下一行'。

效率不是最重要的问题,因为我不需要在快速路径中这样做,只需要在初始化时这样做。

如果有更好的表示矩阵的方法,我为格式道歉。

将每个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 ...

不确定这是否特定于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;