Optimization 特征:按行复制(广播)

Optimization 特征:按行复制(广播),optimization,eigen,Optimization,Eigen,我想复制矩阵M的每一行,而不复制任何内容(即通过创建视图): M.rowwise().replicate(n)是M.replicate(1,n)的shorcut,它似乎没有什么用处 如果M是表达式,则以下代码段将进行复制,并且无法工作 本征::指数行因子=2; Eigen::MatrixXi M2=Eigen::Map(M.data(),1,M.size()).replicate(rowFactor,1); M2.调整大小(M.rows()*rowFactor,M.cols()); 在某些

我想复制矩阵
M
的每一行,而不复制任何内容(即通过创建视图):

  • M.rowwise().replicate(n)
    M.replicate(1,n)
    的shorcut,它似乎没有什么用处

  • 如果
    M
    是表达式,则以下代码段将进行复制,并且无法工作

本征::指数行因子=2; Eigen::MatrixXi M2=Eigen::Map(M.data(),1,M.size()).replicate(rowFactor,1); M2.调整大小(M.rows()*rowFactor,M.cols());
  • 在某些情况下,我可以通过重塑其他操作数来使用中间视图
    Eigen::Map(M.data(),1,M.size()).replicate(rowFactor,1)
    ,但这不是很令人满意

有没有合适的方法来实现这个广播视图?

您需要的基本上是一个带有一个矩阵的。您可以使用(不支持的)进行以下操作:

#include <iostream>
#include <unsupported/Eigen/KroneckerProduct>

int main() {
    Eigen::Matrix2i M; M << 0, 1, 2, 3;
    std::cout << Eigen::kroneckerProduct(M, Eigen::Vector2i::Ones()) << '\n';
}
#包括
#包括
int main(){

虽然使用了临时向量和乘法,但Eigen::Matrix2i M;M是一个很好的解决方案。我必须检查此乘积是否是惰性完成的。
Vector2i::Ones()
不会显式生成。确实会发生乘法运算,但我相信至少对于整数,编译器能够对其进行优化。如果您想100%确定不会发生乘法运算,请查看KroneckerProduct的实现。您是对的。即使是动态版本
VectorXi::one(size)
将返回一个优化的“常量”向量。 Eigen::Index rowFactor = 2; Eigen::MatrixXi M2 = Eigen::Map(M.data(), 1, M.size()).replicate(rowFactor, 1); M2.resize(M.rows()*rowFactor, M.cols()) ;
#include <iostream>
#include <unsupported/Eigen/KroneckerProduct>

int main() {
    Eigen::Matrix2i M; M << 0, 1, 2, 3;
    std::cout << Eigen::kroneckerProduct(M, Eigen::Vector2i::Ones()) << '\n';
}