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

    [C/C++] Normalizzazione valori in un file

    Salve, avrei bisogno di normalizzare una parte dei dati in un file del tipo:
    1 2 3 P 5 -5 4 -6 #1 pippo
    1 2 3 P 7 -5 5 -6 #2 pluto
    .
    .
    -1 4 15 P 5 -5 2 -6 #10 paperino
    I dati da normalizzare (in -1;1) sono quelli in neretto. Qualcuno conosce qualche sorgente che fa al caso mio?
    Grazie per le risposte.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non capisco cosa intendi esattamente con "normalizzare" in questo caso ...

    Hai un file (di testo ?) che contiene delle righe ... mostra una riga *prima* e una riga *dopo* l'operazione che devi compiere ...

    Infine, non credo che troverai un programma gia' fatto ma scrivere uno non e' complicato ... apri il file in lettura, ne apri un altro in scrittura, leggi linea per linea il primo, scrivi nel secondo modificando opportunamente i dati letti, chiudi tutti e due i file alla fine.

    Puoi farlo con qualsiasi linguaggio ...

  3. #3
    Grazie per l' interessamento Oregon.
    Dunque per normalizzazione intendo scalare i dati, che possono avere valori da min a max (con min, ad esempio -5 e max ad esempio 6) in un range -1;1. Come posso saltare i primi 4 valori e iniziare a normalizzare dal 5° valore fino all' ultimo valore che precede il cancelletto?

  4. #4
    Allora, il procedimento dovrebbe essere:


    [list=1][*]leggi tutte i valori di ogni riga dal 5° valore fino all' ultimo fino al cancelletto e memorizzali in un vettore di dati.[*]Trova il massimo e il minimo da questto vettore e memorizza questi valori in val_max e val_min[*]per ogni valore di ogni riga sostituisci tale valore col valore ottenuto da (val-val_min)/(val_max-val_min)[/list=1]

    Per cui ripartendo dal caso di prima:
    1 2 3 P 5 -5 4 -6 #1 pippo
    1 2 3 P 7 -5 5 -6 #2 pluto
    .
    .
    -1 4 15 P 5 -5 2 -6 #10 paperino
    Si dovrebbe avere:
    val_min=-6
    val_max=7
    e i valori normalizzati in 0;1dovrebbero essere:
    1 2 3 P 0.84 0.07 0.76 0 #1 pippo
    1 2 3 P 10.07 0.84 0 #2 pluto
    .
    .
    -1 4 15 P 0.84 0.07 0.61 0 #10 paperino

  5. #5
    Dunque, spero che qualcuno possa aiutarmi...
    Dato un file del tipo:
    4 6 -5 2 1
    5 -3 2
    .
    .
    .
    -4 5 10 -3 2 0
    Sono riuscito a normalizzare i valori in [-1;1], con questo semplice codice:
    codice:
    #include<stdlib.h>
    #include<stdio.h>
    #define max(x,y) ((x>y)?x:y)
    #define min(x,y) ((x<y)?x:y)
    
    int main( int argc, char * argv[] ) {
      int n=100000;
      int vett[n];
      FILE *fd,*fdout;
      int i, res, dimensioni_vettore;
      int min_value=100000;
      int max_value=-100000;
      double lower=-1.0,upper=1.0, value;
      
    		/* apre il file */
      if ( argc != 3 ) {
    		printf("Utilizzo: %s file1 outfile\n",argv[0]);
    		return 1;
    	}
            
    	fd = fopen (argv[1], "r");
    	if ( fd == NULL) {
    		perror("Errore in apertura del file");
                    exit(1);
    	}
    	
    	fdout = fopen (argv[2], "a");
    
            for(i=0; i<n-1; i++){
            res=fscanf(fd, "%d", &vett[i]);
            if( res==EOF )
          	break;
            printf("valore esaminato:%d\n",vett[i]);
            min_value=min(vett[i],min_value);
    	max_value=max(vett[i],max_value);
    	dimensioni_vettore=i;
            
          	}
    
    	
    	printf("max=%d, min=%d\n",max_value,min_value);
    		/* normalizzazione -1;1 */
    	for(i=0; i<dimensioni_vettore+1; i++){
    	if(vett[i] == min_value)
    		value = lower;//-1
    	else if(value == max_value)
    		value = upper;//1
    	else
    		value = lower + (upper-lower) * 
    			(value-min_value)/
    			(max_value-min_value);
    
            fprintf(fdout, "%g ",value);}
    
    
    		/* chiude il file */
    		  fclose(fd);
      		fclose(fdout);
    
      return 0;
    }
    Il problema è che i valori normalizzati sono scritti uno di seguito all' altro senza rispettare il ritorno a capo quando una riga finisce... Questo perché leggo i valori come interi e li inserisco in un vettore di interi che con la funzione fscanf non tiene conto del fine riga e inizio nuova riga...

    Come posso modificare il tutto in modo da scrivere i valori riga per riga, invece che tutti in fila???

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.