C++ 给定两个动态RxC矩阵,如何交错行以生成一个2RxC矩阵?
使用,并给出一个矩阵aC++ 给定两个动态RxC矩阵,如何交错行以生成一个2RxC矩阵?,c++,eigen,C++,Eigen,使用,并给出一个矩阵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, ...
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中的元素”
效率不是最重要的问题,因为我不需要在快速路径中执行此操作,只需要在初始化时执行
如果有更好的方法来表示矩阵,我对格式表示歉意。将每个R x C矩阵乘以一个2R x R矩阵,该矩阵由相应对角线上的0和1组成,然后相加 矩阵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,但您可以使用
映射
和跨步
对象交错行
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;
MatrixXi C(A.rows()+B.rows(),A.cols());
Map(C.data(),A.rows(),A.cols(),Stride(2*A.rows(),2))=A;
Map(C.data()+1,B.rows(),B.cols(),Stride(2*B.rows(),2))=B;
有趣的想法,尽管有些地方似乎有点不对劲,因为我无法将RxC乘以2RxR矩阵,因为内部尺寸不匹配,即使匹配,我也会得到RxR结果,而不是2RxC。此外,构建“交流发电机”矩阵的复杂性与执行单位矩阵和零矩阵的交织一样复杂,因此我需要至少运行一次循环来生成它们。但我真的很喜欢这个想法,因为我可以缓存“交流发电机”矩阵并重复使用它们。如果你交换矩阵,例如,(矩阵1*a)+(矩阵2*b),它会起作用。啊,对。我的线性代数老师在某处对我皱眉。谢谢。如果你使用的是Eigen3,并且你想通过矩阵乘法来实现这些,至少要使用稀疏矩阵。