2017-05-16 6 views
0

Dans Eigen, j'ai une matrice réelle M x kN, stockée dans l'ordre par défaut de la colonne par défaut. Chacune des lignes M contient N k -tuples; e g, pour k=3, (a0 b0 c0 a1 b1 c1 ... aN bN cN). Comment puis-je extraire des vecteurs (ou une matrice dont les lignes ou les colonnes sont un ensemble de vecteurs kN) contenant tous les éléments k-? e g, (a0 a1 ... aN), (b0 b1 ... bN), etc.Sélectionner tous les k éléments de la matrice ou du vecteur Eigen?

64 bits de Windows 7, Visual C++

Répondre

0

Utilisez un Eigen::Map et régler la foulée extérieure à k * m.cols().

#include <Eigen/Core> 
#include <iostream> 
int main() 
{ 
    int sz = 8; 
    Eigen::MatrixXd m(8,8); 

    Eigen::Map<Eigen::VectorXd>(m.data(), sz*sz).setLinSpaced(1., sz*sz); 

    std::cout << m << "\n\n"; 
    int k = 2; 
    Eigen::Map<Eigen::MatrixXd, 0, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>> 
     mp(m.data(), sz, sz/k, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(k*m.cols(),1)); 

    std::cout << mp << "\n\n"; 

    Eigen::MatrixXd m2 = mp; 

    std::cout << m2 << "\n\n"; 

    return 0; 
} 
+0

Je pense que vous voulez dire 'k * m.rows()' dans la foulée de 'mp'. Avec ce changement, j'obtiens le premier élément correct de chaque tuple. Quelle est la façon la plus simple d'obtenir la seconde, ... ',' k-ième éléments? – Woody20

+0

La méthode la plus simple pour obtenir l'élément 'p'th serait de passer' m.data() + p' à 'Map'. –

+0

Fonctionne comme annoncé. Maintenant, j'ai juste besoin d'un visualiseur pour la carte (fichier Visual Studio .natvis). – Woody20