Formattazione fortran...con Matlab

di il
13 risposte

Formattazione fortran...con Matlab

Buongiorno a tutto il forum.

da neofita di Matlab mi vedo costretto a chiedervi aiuto riguardo la formattazione in output di una matrice di dati.

In buona sostanza ho una matrice di dati importata da excel o da un file di testo composta da circa 115000 righe che devo formattare in output secondo il formato fortran (che conosco..).
Fin da ora sono riuscito ad importare i dati (le colonne che voglio formattare) ma trovo estreme difficoltà a formattare come richiesto.
Vi chiedo di indicarmi la strada

Se avete bisogno di ulteriori informazioni resto a disposizione.
Un saluto
Baglieri

13 Risposte

  • Re: Formattazione fortran...con Matlab

    Prova a fare un esempio del tipo di formattazione che vorresti ottenere...
  • Re: Formattazione fortran...con Matlab

    Il file in uscita dovrebbe avere la seguente formattazione:

    FORMAT (4(I2,1X), F6.1,1X, I1,1X, F5.0,1X, F7.2,1X, F7.1, 1X,F6.1, 1X,F7.2)

    del tipo:
    anno mese giorno ora valore1 valore2 valore 3 valore 4 valore6 valore 6
    5 1 1 1 32.0 0 350. 1.48 7.3 99.0 99.00
    ....
    ....
    5 1 1 1 32.0 1 350. 1.48 7.3 99.0 99.00

    La data, inoltre, dovrebbe essere estrapolata dal valore del tipo 00/00/2011

    Grazie per l'aiuto..mi rendo conto che la spiegazione è fin troppa confusa ma servirebbe un input per iniziare.

    Saluti
    Baglieri
  • Re: Formattazione fortran...con Matlab

    Purtroppo non conosco il significato della riga che hai scritto (format...)
    Comunque, vediamo se ho capito. Hai un file excel dal quale hai estrapolato dei dati che ti ritrovi in matlab sotto forma di matrice (che immagino sia quella che hai scritto).
    Da questa devi creare un altro file (di testo/excel) con i valori del primo file in un'altro formato.
    L'unica cosa che (forse!) capito è la data.
    Nella matrice iniziale hai qualcosa del tipo
    2005 12 1
    2006 3 6
    e vuoi che nel file di output ci sia
    01/12/2005
    06/03/2006
    Se così fosse, ti basterebbe usare la funzione datestr per convertire il vettore in stringa con il formato dd/mm/aaaa.
    Ad esempio, se la matrice iniziale si chiama A
    B = datestr(datenum(A(1),A(2),A(3)),20); 
    ti restituisce (in questo caso la prima riga, poi con un ciclo lo fai per tutta la matrice) con il formato che vuoi.
  • Re: Formattazione fortran...con Matlab

    Non sono stato molto chiaro. Provo a descrivere meglio il problema:
    Esempio su dati presi come esempio:

    File excel in input (dati di prova)

    2005 1 1 1 1,6842 349,43 279,97 990,99 73,076
    2005 1 1 1 1,7964 350,3 279,69 988,87 74,106
    2005 1 1 1 2,1661 353,02 279,12 985,55 76,471
    2005 1 1 1 2,5197 357,82 278,54 980,39 79,053
    2005 1 1 1 2,7497 8,3767 277,9 971,43 81,611
    2005 1 1 1 3,8343 29,591 277,43 956,64 79,491
    2005 1 1 1 4,9417 46,158 277,06 933,42 72,207
    2005 1 1 1 3,6597 43,906 275,71 899,54 69,328
    2005 1 1 1 2,0219 343,22 273,18 853,32 69,713
    2005 1 1 1 3,4948 353,6 270,42 793,92 62,168
    2005 1 1 1 5,6265 25,691 267,12 721,84 51,182

    File di testo come output di esempio formattato come:

    4(I2,1X), F6.1,1X, I1,1X, F5.0,1X, F7.2,1X, F7.1, 1X,F6.1, 1X,F7.2

    5 1 1 1 10.0 0 13. 2.42 6.1 99.0 99.00
    5 1 1 1 32.0 0 12. 2.51 5.9 99.0 99.00
    5 1 1 1 62.0 0 12. 2.66 5.6 99.0 99.00
    5 1 1 1 105.0 0 11. 2.81 5.2 99.0 99.00
    5 1 1 1 305.0 0 10. 3.00 4.6 99.0 99.00
    5 1 1 1 505.0 0 11. 3.11 3.3 99.0 99.00
    5 1 1 1 805.0 0 38. 5.03 2.0 99.0 99.00
    5 1 1 1 1230.0 0 52. 7.00 1.2 99.0 99.00
    5 1 1 1 1505.0 0 27. 3.00 -0.8 99.0 99.00
    5 1 1 1 1805.0 0 16. 3.43 -3.2 99.0 99.00
    5 1 1 1 2300.0 0 29. 5.43 -7.0 99.0 99.00
    5 1 1 1 3480.0 1 40. 7.92 -12.4 99.0 99.00

    Colonne in output:
    1-anno
    2-mese
    3-giorno
    4-ora
    5- dati che non si trovano nel file excel e che si ripetono identici ogni 12 righe (da 10 a 3480)
    6 - 0 sempre ed 1 in corrispondenza dell'ultimo valore 3480
    7-valore in excel
    8-valore in excel
    9-valore in excel
    10-valore non presente in excel(che potrebbe però essere inserito) uguale a 99
    11-valore non presente in excel(che potrebbe però essere inserito) uguale a 99
  • Re: Formattazione fortran...con Matlab

    Credo di non aver ancora compreso pienamente, ma provo con un'altra strada...
    hai il file excel. Non ho capito se sei riuscito a ricavarne una matrice con matlab, comunque con la funzione xlsread dovrebbe essere abbastanza immediato. Chiamo la matrice ottenuta E.
    Cominciando dalle cose più semplici. La matrice di output, che poi andremo a scrivere in un file di testo, ha 11 colonne e 3480(?) righe. La creo:
    A=zeros(3480,11);
    ora le ultime due righe:
    A(:, 10:11)=99;
    Poi le righe con i valori di excel:
    A(:,7:9)=E(:,7:9);
    e così via...
    siamo sulla strada giusta?
  • Re: Formattazione fortran...con Matlab

    La matrice con matlab è stata creata correttamente importando i dati direttamente da excel.
    Quindi la lettura dei valori in excel avviene correttamente.
    Il problema sorge quando devo restituire la matrice dei dati formattata secondo quelle specifiche fortran (4(I2,1X), F6.1,1X, I1,1X, F5.0,1X, F7.2,1X, F7.1, 1X,F6.1, 1X,F7.2).
    La matrice in uscita è composta da 11 colonne e 115000 righe circa. Quello che ho riportato nel messaggio precedente è riferito solo alla prima ora dell'anno.

    Scusa se non sono stato chiaro...

    Saluti e grazie per l'interessamento

    P.S. Comunque già nel tuo messaggio precedente ci sono utili suggerimenti...l'inserimento del 99 nelle ultime due righe OK
  • Re: Formattazione fortran...con Matlab

    Purtroppo, per me la riga (4(I2,1X), F6.1,1X, I1,1X, F5.0,1X, F7.2,1X, F7.1, 1X,F6.1, 1X,F7.2) è incomprensibile...
    Per la colonna 6 dovrebbe essere abbastanza semplice, se l'uno capita sempre ogni tot righe, altrimenti con un if devi andare a controllare la colonna 5 e mettere un 1 se c'è il valore 3480 (si dovrebbe poter fare con una sola riga di codice).
    Per la colonna 5, se i valori sono sempre gli stessi, puoi creare un vettore con i 12 valori e poi usare la funzione repmat per ottenere il vettore finale che poi vai ad inserire nella matrice finale, sempre nel solito modo...
    A(:, 5)= vettore;
  • Re: Formattazione fortran...con Matlab

    Ok grazie.

    Quella formattazione è riferita al linguaggio fortran. Sono descrittori di formato così definiti:

    Iw leggi i successivi "w" caratteri come un intero
    Fw.d leggi i successivi "w" caratteri come un reale R4 con "d"decimali (se il punto decimale non è presente)
    nX ignora i successivi "n"caratteri.

    Il 4 sta per ripetilo 4 volte.

    Intanto grazie...alcuni problemi credo che, grazie ai tuoi suggerimenti, possono essere rioslti.
  • Re: Formattazione fortran...con Matlab

    Buongiorno

    Se non è possibile formattare in quel modo automaticamente attraverso qualche comando, forse, sarebbe possibile farlo manualmente inserendo gli spazi (IX) dove richiesto e formattando i valori con i relativi decimali per singola colonna. Cioè:

    4(I2,1X) corrisponde a 5 1 1 1 (data nella matrice iniziale 1/1/2005)
    F6.1 corrisponde al vettore 10:3480 che deve ripetersi ogni 12 righe
    1X spazio
    I1 come il vettore 0 0 0 0 0 0 0 0 0 0 1 da ripetersi ogni 12 righe
    F5.0 valore nella matrice in excel....e così via..

    Si potrebbe leggere la matrice per colonna ed inserire una colonna di tutti spazi (IX) e così via fino a creare la matrice completa. In pratica leggo prima 2005 e scrivo 5. Poi inserisco la colonna spazio..leggo 1 ed inserisco spazio..

    Mah..si potrebbe fare i questo modo?

    Saluti
  • Re: Formattazione fortran...con Matlab

    No... allora, funziona così: devi prima crearti la matrice con tutti i valori che ti servono, costruendola colonna per colonna. Poi, dici a matlab di scrivere i valori presenti nella matrice in un file di testo, secondo il formato che vuoi tu.
    Ti faccio l'esempio, siamo arrivati al punto di aver creato la matrice con tutti i valori necessari (per ora semplifico e ne scrivo una ridotta);
    a=[5 1 1 1 0.99; 5 1 1 2 0.99];
    poi scrivi il codice per scrivere il file di testo, sono tre righe, una apre il file, una lo scrive e una lo chiude.La più importante è ovviamente la riga di mezzo in cui gli dai la formattazione. Viene utilizzata la convenzione che si usa nel c/c++
    fid=fopen('prova.txt','wt');
    fprintf(fid, '%d %d %d %d %1.2f\n', a')
    fclose(fid);
    In questo caso gli sto dicendo che, separati da spazi, di sono 4 interi e un numero float con due decimali. Il \n gli dice di andare a capo alla fine di ogni riga.
    Da notare che gli passo la matrice trasposta perché legge per colonne la matrice originale.
  • Re: Formattazione fortran...con Matlab

    Ok..grazie...nella giornata di oggi faccio delle prove. Credo comunque che siamo sulla strada giusta!
  • Re: Formattazione fortran...con Matlab

    Ebbene...sto provando

    Con il seguente codice (provato su Scilab) formatta i dati in uscita correttamente:

    fileIN='testok.txt'; //'test.txt'
    fileOUT='text2.txt';//'prova2.txt'
    deletefile(fileOUT)
    fid = file ('open',fileIN,'unknown')
    data=read(fid,-1,11)
    fd = mopen(fileOUT,'wt');
    mfprintf(fd,'%2i %2i %2i %2i %7.1f %1i %7.1f %8.2f %8.2f %8.2f %8.2f \n',data)
    file('close',fd)

    Secondo voi ci sono errori?

    Ora se tutto ok mi servirebbe un'altro sugegrimento.

    Se nel file in input manca la 5 e 6 colonna devo inserire due vettori che si ripetono fino alla fine ogni 12 righe:

    I vettori sono i seguenti:

    (10, 32, 44, 50, 60, 70, 80, 90, 290, 500,700, 3280)
    (0,0,0,0,0,0,0,0,0,0,0,1) con il valore 1 in corrispondenza di 3280.
    Come potrebbe essere effettuata tale operazione?

    Saluti e grazie
    Cris
  • Re: Formattazione fortran...con Matlab

    Puoi usare la funzione repmat per ripetere il vettore che poi andrai ad inserire nella matrice.
Devi accedere o registrarti per scrivere nel forum
13 risposte