2017-09-08 31 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

相關問題