2017-09-08 4 views
1

j'ai un vecteur VEC et je veux obtenir un nouveau vec2 « d'expression » en copiant les valeurs le long de la dimension du vecteurEigen: répliquent les éléments le long d'une dimension sans allocations inutiles

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 

Bien sûr, je peux créer un tel vecteur manuellement ou en utilisant répliquées + vectorisation par Eigen :: Carte:

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

Mais je veux vec2 être une sorte de « modèle d'expression eigen » sans allication (vEC peut être assez grand et je vais appeler cette routine assez souvent) et le calcul immédiat des valeurs. (vec contient des poids par vertex et je veux l'utiliser pour les moindres carrés pondérés)

J'ai pensé à l'astuce du produit kronecker avec le vecteur de ceux, mais je ne suis pas sûr qu'il est optimisé pour le produit par ceux. Je préfère également éviter le module non pris en charge

PS Désolé pour mon anglais

Répondre

3

Utilisation de la branche devel vous pouvez utiliser LinSpaced pour générer la séquence d'indices et indexer le vecteur d'entrée:

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

vous pouvez puis envelopper la ligne de touches dans une fonction libre retour auto, en 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)); 
} 

et dans principal:

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

Merci pour votre réponse! Ça a l'air génial. Juste deux questions - ArrayXi :: LinSpaced n'alloue rien? Et est-ce stable? –

+1

aucune allocation du tout. – ggael