Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] ordinamento matrice

    Ciao a tutti
    Cerchero' di spiegare quale e' il mio caso, con un esempio concreto. Spero che sappiate aiutarmi e/o indirizzarmi verso la soluzione

    Suddivido un cubo in n*n*n=n3 cubetti, tutti uguali. Ad esempio, con n=5 ottengo 125 cubetti. Ciascun cubetto e' univocamente identificato dal valore dei suoi indici i,j,k, ovvero e' un elemento di una matrice 5*5*5. Associo una certa informazione ai cubetti, producendo il seguente file di output:

    2 2 0 39.7859 -43.25 0. 0.
    2 2 1 48.8834 -35.25 0. 0.
    2 2 2 74.1863 -27.25 0. 0.
    2 2 3 36.7781 -19.25 0. 0.
    2 2 0 0.366242 -43.25 0. 0.
    2 2 0 38.0836 -43.25 0. 0.
    2 2 1 48.121 -35.25 0. 0.

    Gli ultimi 3 numeri sono la posizione del cubetto in un dato sistema di riferimento. Come si vede, di tutti i possibili 125 cubetti, alcuni cubetti non vengono coinvolti: nell'output sono presenti solo 4 cubetti: 2 2 0, 2 2 1, 2 2 2, 2 2 3. Di questi, alcuni sono presenti piu' volte.
    Quello che devo fare e' elaborare il file di output in modo da ottenere una lista dei cubetti (senza ripetizioni), associando a ciascun cubetto della lista la somma dell'informazione, cioe', facendo riferimento all'esempio di sopra:

    2 2 0 (39.7859+0.366242+38.0836) -43.25 0. 0.
    2 2 1 (48.8834+48.121) -35.25 0. 0.
    2 2 2 74.1863 -27.25 0. 0.
    2 2 3 36.7781 -19.25 0. 0.

    Ho dato un'occhiata al forum e su web, cercando secondo la parola chiave "ordinamento", ma non sono riuscita a dissolvere i miei dubbi. Ho provato a immaginare l'intero file di output di partenza come una matrice bidimensionale h*m, con h=numero di righe che costituiscono il file (nell'esempio h=7) e m=numero di colonne (nell'esempio m=7). Certamente, il punto di partenza sarebbe riordinare la matrice tenendo conto dei valori assunti dalle colonne 1,2,3... ma come? La verita' e' che non ho esperienza di algoritmi e non riesco a rendermi conto se quello che ho proposto e' un problema standard.

    Attendo fiduciosa qualsiasi vostra indicazione

  2. #2
    Non si tratta di ordinamento, ma accumulazione o group by.
    Studiati std::map, std::multi_map ottimi per questo genere di cose.
    Nel tuo caso si potrebbe utilizzare una std::map, con chiave l'indice dei cubetti trasformato in std::string e per valore, una strutturina contenente le coordinate associate ad ogni cubetto.

  3. #3
    Grazie per l'indicazione!
    Mi sono documentata su map et similia e sono riuscita ad ottenere qualcosa di buono (mi sembra incredibile... troppo semplice per essere vero!), con chiave un int corrispondente alla cella (cioe' k*5^0+j*5^1+i*5^2) e con valore un double (e poi li' ci metto il valore della quarta colonne)
    map<int,double> cubetto;

    Pero' io in effetti avrei bisogno di utilizzare, come valore, una struttura, composta da 4 double, in modo da associare univocamente ad ogni cella il contenuto delle ultime quattro colonne, esattamente come hai suggerito tu. Il problema e' che non sono riuscita a trovare nessun esempio di questo tipo, puoi aiutarmi? A dire il vero, ho spulciato google in lungo e in largo per trovare documentazione su map... e ne ho trovata proprio pochina... a questo proposito, sai indicarmi qualche link utile?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    codice:
    struct Fields {
        double a;
        double b;
        double c;
        double d;
    };
    
    std::map<int,Fields> map_of_fields;
    
    Fields temp;
    
    map_of_fields.insert(std:make_pair(10,temp));

  5. #5
    Ciao!
    Avevo gia' provato la soluzione da te proposta, ma ricevevo molti errori in fase di compilazione e mi ero convinta che quella che sembrava la souzione piu' semplice per includere una struttura come valore mappato non fosse la strada corretta. In realta', facevo un errore molto molto banale, riguardo all'utilizzo delle strutture (ooops... ), che qui riporto per i posteri: la struttura deve essere definita al di fuori della funzione in cui e' definita la mappa!
    Grazie per l'aiuto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.