Dlmwrite

di il
5 risposte

Dlmwrite

Salve a tutti
Ho un piccolo problema. In pratica ho un vettore diciamo 60X2. Vorrei creare un file esterno txt con dentro gli elementi di questo vettore ordinati secondo la medisima struttura del vettore. In pratica vorrei ottenere due colonne di numeri, ma purtroppo non riesco ad impostare i vari delimiter

Grazie a tutti per l'aiuto

5 Risposte

  • Re: Dlmwrite

    Dalla domanda non si capisce quale sia il problema:
    [*] la funzione genera un messaggio di errore? Quale?
    [*] il 'delimiter' è stato specificato, ma il formato del file di testo non è quello atteso?

    Volendo scrivere i valori di una matrice (60x2) in un file di testo utilizzando la funzione "dlmwrite" è sufficiente definire un solo "delimiter", quello che separa la seconda colonna dalla prima.

    Gli esempi forniti dall'help di MatLab sono molto chiari.
    Data, per esempio, la matrice

    M=rand(60,2);

    le istruzioni per la sua scrittura in un file di testo chiamato "dlmwite_es_1.txt" possono essere:

    dlmwrite('dlmwite_es_1.txt',M): utilizzo "base" della funzione, il nome del file è definito direttamente come stringa, il "delimiter" (non specificato tra i parametri in input alla funzione) di "default" è la virgola ed il file di output ha il seguente aspetto:
    4.0492,18.272
    42.452,10.121
    54.022,20.158
    95.383,13.475
    20.891,32.379
    ...
    dlmwrite('dlmwite_es_2.txt',M,'\t'): il nome del file è definito direttamente come stringa, il "delimiter" '\t' (tab) è specificato tra gli input, le colonne sono separate da un carattere di tabulazione, ed il file di output ha il seguente aspetto:
    26.209	34.321
    56.975	46.261
    35.955	36.782
    2.6839	67.957
    50.042	56.778
    ...
    dlmwrite('dlmwite_es_3.txt',M,'delimiter',' ','precision','%10.3f'): rispetto al caso precedente, il "delimiter" ' ' (blanc") è specificato tra gli input, le colonne sono separate da uno "spazio bianco", il parametro "'precision' definisce il formato: i valori sono scritti secondo il "format" '10.3f' (10 caratteri - compreso il "." di cui 3 decimali) ed il file di output ha il seguente aspetto:
         4.049     18.272
        42.452     10.121
        54.022     20.158
        95.383     13.475
        20.891     32.379
    ...
    dlmwrite('dlmwite_es_4.txt',M,'delimiter',' ','roffset',3,'precision','%10.3f'): rispetto al caso precedente è stato aggiunto il paraemtro 'roffset': i dati vengono scritti nel file a partire dalla quarta riga (le prime tre vengono lasciate vuote). Il file di output ha il seguente aspetto:
    
     
     
     
         4.049     18.272
        42.452     10.121
        54.022     20.158
        95.383     13.475
        20.891     32.379
    ...
    dlmwrite('dlmwite_es_5.txt',M,'delimiter',' ','coffset',3,'precision','%10.3f'): rispetto al caso precedente, il parametro 'roffset' è stato sostituito dal parametro 'coffset'; i valori sono scritti nel file a partire dalla quarta colonna (del file)., Il file ha il seguente aspetto:
            4.049     18.272
           42.452     10.121
           54.022     20.158
           95.383     13.475
           20.891     32.379
    ...
    dlmwrite('dlmwite_es_6.txt',M,'delimiter',' ','roffset',3,'coffset',3,'precision','%10.3f'): combinazione di offset per righe e colonne. Il file ha il seguente aspetto.
    
        
        
        
            4.049     18.272
           42.452     10.121
           54.022     20.158
           95.383     13.475
           20.891     32.379
    ...
    Nota: ovviamente il nome del file può essere anche passato alla funzione tramite una variabile di tipo stringa:

    fname='dlmwite_es_7.txt';
    dlmwrite(fname,M)

    Lo script utilizzato per generare i casi sopra descritti è riportato di seguito.

    Hope this helps.
  • Re: Dlmwrite

    Grazie mille per l'interesse innanzi tutto

    Però copiando direttamente quello che hai scritto non so come ma viene diverso. Ho utilizzato la il codice che hai messo nel secondo esempio che è proprio quello che farebbe al caso mio

    in pratica se ho un matrice di questo tipo M=[1 2 3; 4 5 6; 7 8 9]

    quello che mi ritrovo nel file di destinazione è questa cosa qui:

    1 2 34 5 67 8 9

    Sono disperata e ti assicuro che ho fatto copia+incolla di quello che hai scritto tu
  • Re: Dlmwrite

    Forse ho scoperto qual è il problema.

    Potrebbe trattarsi di una combinazione del modo in cui la funzione "dlmwrite" gestisce il carattere "newline" e del modo con cui gli editors lo interpretano.

    Ho provato a scrivere su un file di testo la matrice:

    M=[1 2 3; 4 5 6; 7 8 9];

    usando le funzioni "dlmwrite" con i parametri indicati nella precedente risposta e ad aprirli con due editors diversi.
    Il risultato è stato:

    Notapad++
    1	2	3
    4	5	6
    7	8	9
    
    Blocco Note
    
    1	2	34	5	67	8	9
    
    Ho quindi provato ad aggiungere agli input della funzione "dlmwrite" la coppia 'newline'','pc' e sono riuscito a "visualizzare" correttamente il file anche con "Blocco Note".

    A quanto pare la chiamata corretta per la funzione è:

    dlmwrite('dlmwite_es_3.txt',M,'delimiter','\t','newline','pc')

    Ho sottolineato "visualizzare" in quanto, con "Blocco Note", succede una cosa "apparentemente" strana: effettivamente aprendo il file il contenuto appare su una sola riga, come sopra riportato, ma, quando ho copiato la riga per "incollarla" sopra, il risultato è stato che i numeri si sono disposti "come avrebbero dovuto", cioè tre per riga.
    In effetti per poterli scrivere su una sola riga, ho dovuto scriverli "a mano".

    In conclusione, si può:

    [*] provare ad aprire i file generati con le istruzioni riportate nella precedente risposta con editors diversi
    [*] riprovare a riscrivere i files di testo aggiungendo la coppia di paramatri 'newline','pc'

    Hope this helps.
  • Re: Dlmwrite

    Grazie ancora

    Giusto oggi infatti ho visto che aprendo il file generato dalla colonna sinistra di matlab me lo visualizzava giusto, mentre aprendolo con blocco note dalla cartella mi dava quel formato che avevo citato nel commento precedente.
    Inoltre mi ero dimanticata di specificare che questo file lo avrei dovuto aprire in seguito con xfoil, per questo era così importante la formattazione che avevo citato

    Comunque per dovere di cronaca ho scoperto che si può fare anche in un altro modo abbastanza semplice utilizzando il comando 'save' con questa sintassi (nel caso gli altri forumisti ne abbiano bisogno):

    save('nomefile.txt','nomematrice','-ASCII')

    Grazie ancora ask_raf
  • Re: Dlmwrite

    E' stato interessante!
    Spesso il problema non è dove lo si cerca.
Devi accedere o registrarti per scrivere nel forum
5 risposte