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)
的shorcut,它似乎没有什么用处M.replicate(1,n)
- 如果
是表达式,则以下代码段将进行复制,并且无法工作M
- 在某些情况下,我可以通过重塑其他操作数来使用中间视图
,但这不是很令人满意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';
}