优化-特征:按行复制(广播)

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

0  1          0  1
2  3    ->    0  1
              2  3
              2  3

> M.rowwise().replicate(n)是M.replicate(1,n)的捷径,这似乎毫无用处.
>以下代码段进行复制,如果M是表达式,则该代码段不起作用.

    Eigen::Index rowFactor = 2;
    Eigen::MatrixXi M2 = Eigen::Map(M.data(), 1, M.size()).replicate(rowFactor, 1);
    M2.resize(M.rows()*rowFactor, M.cols()) ;

>在某些情况下,我可以通过重塑其他操作数来使用中间视图Eigen :: Map< Eigen :: MatrixXi>(M.data(),1,M.size()).replicate(rowFactor,1),但是这不是很令人满意.

是否有实现此广播视图的正确方法?

最佳答案
本质上您想要的是一个矩阵为1的Kronecker product.您可以为此使用(不受支持的)KroneckerProduct module

#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';
}

“不受支持”意味着该模块的API不能保证稳定(尽管我认为自引入以来该模块并未更改).

转载注明原文:优化-特征:按行复制(广播) - 代码日志