IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

transposer un vecteur de vecteur sans boucle for


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Par défaut transposer un vecteur de vecteur sans boucle for
    Bonjour,
    J'ai un petit problème que je n'arrive pas à résoudre !
    Je dispose en entrée de la variable suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::vector<double>> tableau;
    il est de taille C * L
    C'est à dire qu'il comporte "C" tableaux contenant chacun "L" valeurs numériques (double);
    On peut se le représenter comme une "matrice" contenant "C" colonnes et "L" lignes.

    J'aimerai pouvoir "transposer" cette matrice. C'est à dire obtenir un tableau de taille L*C.

    Le but de cette transformation est de pouvoir calculer le min et max de chaque "ligne" de la matrice initiale à l'aide d'un calcul utilisant un std;;valarray.

    Je souhaite effectuer cette transformation sans boucle for à cause de la dimension L qui peut atteindre une taille de 200000 valeurs

    J'espère que j'ai été claire ! Est ce que qqn aurait une piste à me proposer ?
    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    En somme tu souhaites traiter toutes les valeurs...sans traiter toutes les valeurs?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Plus sérieusement, la matrice transposée resservira t'elle, ou non? Si c'est seulement pour faire ces calculs de max, il vaut peut-être mieux se contenter de faire la comparaison au fil du parcours de la matrice...

  4. #4
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Par défaut
    Non la matrice ne me resservira pas par la suite une fois les calculs de min et max seront effectués.

    Le code implémenté actuellement consiste en une boucle for avec itération sur les lignes de mon tableau et calcul au fur et à mesure des min et max..
    Mais le problème que j'ai est que le nombre de lignes est souvent très important et le parcours de la boucle est particulièrement long. C'est pour ça que je voulais savoir s'il existait un moyen d'implémenter ce code sans boucle for

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    La piste des matrices creuses revient à retravailler la représentation initiale de la matrice. Peux tu remplacer ce vector de vector par autre chose? La notion de matrice creuse revient à dire: "j'ai une matrice L*C car ce sont les dimensions de mon espace, mais la pluspart des valeurs sont nulles" et employer des optimisations pour ne pas traiter les valeurs nulles.
    Autre possibilité: le parcours se fait aussi au remplissage, peut-être peux-tu en profiter pour calculer le min et le max. Si les valeurs rechangent par la suite, tu peux (par exemple en encapsulant tes données dans une classe qui fait ce contrôle) maintenir ces min/max à jour en traitant simplement l'ancienne et la nouvelle valeur de la donnée mise à jour.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    Je soutiens les propositions de therwald.

    Si les matrices creuses ne peuvent pas être utilisées pour ton problème, un vector de vector reste une mauvaise idée. Il vaut mieux utiliser un seul vector de taille C*L et accéder aux éléments en calculant leur indice. Par exemple, l'élément situé à la 3ème colonne et à la 4ème ligne peut se situer à l'index C*3 + 4. La FAQ contient des exemples à ce sujet. Pour avoir une matrice transposée, il n'y a rien à faire à part calculer l'index différemment.

    Construire une matrice transposée pour ensuite la parcourir afin de calculer des min et max a peu de sens. Le faire, pour ensuite construire des valarray pour ensuite les parcourir (même si c'est caché dans la fonction membre max) est encore pire. Allouer et copier de la mémoire est coûteux. Tu ne gagneras pas en performances en faisant ceci, et tu n'éviteras pas le parcours.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 492
    Par défaut
    Si L est constante pour un tableau donné, utiliser un vector<vector<T>> est une erreur.
    Si C est une constante à la compilation, utiliser un vector<T> est une erreur.

    Si L et C sont des variables et que la densité de données est faible, il existe des classes de type matrices "creuses" dans plusieurs bibliothèques mathématiques.

  8. #8
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Par défaut
    Merci pour ta réponse.

    L et C ne sont pas des constantes mais varient à chaque appel de la fonction donc je suis obligée de passer par des std::vector.
    Je vais regarder du coté des matrices "creuses" alors!

Discussions similaires

  1. "Comparer" un vecteur à une matrice sans boucle for
    Par nawellee dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/04/2013, 20h55
  2. fonction colon pour cell (sans boucle for)
    Par soft001 dans le forum MATLAB
    Réponses: 1
    Dernier message: 11/09/2011, 13h11
  3. [Dojo] Recherche d'un attribut dans iframe sans boucle for
    Par Lionkid dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 21/10/2010, 14h58
  4. Remplir la diagonale d'une matrice sans boucle FOR-END
    Par francois_S dans le forum MATLAB
    Réponses: 3
    Dernier message: 30/03/2010, 08h32
  5. Comparaison de deux matrices sans boucle for
    Par zicos dans le forum MATLAB
    Réponses: 8
    Dernier message: 04/05/2007, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo