Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 给定两个动态RxC矩阵,如何交错行以生成一个2RxC矩阵?_C++_Eigen - Fatal编程技术网

C++ 给定两个动态RxC矩阵,如何交错行以生成一个2RxC矩阵?

C++ 给定两个动态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

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,并且你想通过矩阵乘法来实现这些,至少要使用稀疏矩阵。