2017-09-08 32 views
1

我有一些向量VEC,我想通过沿着矢量本征:复制沿着一个维度的项目没有无用的分配

Eigen::VectorXf vec(5); 
vec << 1, 2, 3, 4, 5; 
const auto vec2 = vec.someAwesomeEigenMagic<3>(); 
//vec2 should contains (1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5)^T 
//Not (1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5)^T 

我当然可以创建这样的载体的尺寸复制值,以获得一个新的“表达” VEC2手动或使用重复+量化的本征::地图:

MatrixXf tmp = vec.replicate(1, 3).transpose(); 
const Map<VectorXf> vec2(tmp.data(), vec.rows() * 3, 1); 

但我想vec2是某种“固有模板表达式”没有allication(VEC可以说是相当大的,我会常常调用这个例程)并立即计算值。 (vec包含每个顶点的权重,我想用它来加权最小二乘)

我想过有关kronecker产品的技巧,但我不确定它是否针对产品进行了优化。此外,我希望避免不支持的模块

PS对不起,我的英语

回答

3

使用devel的分支,您可以使用LinSpaced生成指数的序列,然后指数输入向量:

#include <iostream> 
#include <Eigen/Dense> 
using namespace Eigen; 
using namespace std; 

int main() 
{ 
    VectorXf vec(5); 
    vec << 1, 2, 3, 4, 5; 
    auto vecrep = vec(ArrayXi::LinSpaced(5*3,0,4)); 
    cout << vecrep.transpose() << endl; 
} 

可以然后包自由函数返回auto内的关键线,在C++ 14:

template<typename XprType> 
auto magic_rep(const XprType &xpr, Index K) { 
    return xpr(Eigen::ArrayXi::LinSpaced(xpr.size()*K,0,xpr.size()-1)); 
} 

和在主:

cout << magic_rep(vec,3).transpose() << endl; 
+0

谢谢你的回答!看起来很棒。只有两个问题 - ArrayXi :: LinSpaced没有分配任何东西?它是稳定的吗? –

+1

根本没有分配。 – ggael

相关问题