PDA

View Full Version : [matlab] esportare file di testo


pietro84
06-03-2008, 23:51
ho una grossa mole di dati da elaborare; questi dati sono costituiti da una matrice di 7000*7000 elementi. ora devo fare dei calcoli su questi elementi per effettuare una normalizzazione. la matrice va data in pasto a un sw diverso da Matlab, mi chiedo però se posso normalizzare i dati importando il file txt in matlab, normalizzando, ed esportando ancora in formato txt la matrice risultante.
Ho trovato un piccolo problema: quando matlab salva il risultato su file lo fa in notazione esponenziale, per esempio :

1.000e-001 anzichè 0.001

c'è qualche modo per ovviare ?
sull'help non c'è scritto nulla.

bjt2
07-03-2008, 05:55
ho una grossa mole di dati da elaborare; questi dati sono costituiti da una matrice di 7000*7000 elementi. ora devo fare dei calcoli su questi elementi per effettuare una normalizzazione. la matrice va data in pasto a un sw diverso da Matlab, mi chiedo però se posso normalizzare i dati importando il file txt in matlab, normalizzando, ed esportando ancora in formato txt la matrice risultante.
Ho trovato un piccolo problema: quando matlab salva il risultato su file lo fa in notazione esponenziale, per esempio :

1.000e-001 anzichè 0.001

c'è qualche modo per ovviare ?
sull'help non c'è scritto nulla.

Per salvare in formato testo, usa il comando
SAVE file.txt <nome variabile> -ASCII -DOUBLE

-ASCII salva in formato testo
-DOUBLE salva con 16 cifre decimali

Se vuoi il file TAB separated anzichè comma separated, aggiungi -TABS in coda

Per leggere il file di nuovo, usa textread. Preso dall'help di textread:

To read all numeric data from a delimited text file, use a single output
argument, empty format string, and the appropriate delimiter. For
example, suppose data.csv contains:
1,2,3,4
5,6,7,8
9,10,11,12

Read the whole matrix into a single variable:
[data] = textread('data.csv','','delimiter',',');


Ciao. :)

pietro84
07-03-2008, 08:22
Per salvare in formato testo, usa il comando
SAVE file.txt <nome variabile> -ASCII -DOUBLE

-ASCII salva in formato testo
-DOUBLE salva con 16 cifre decimali

Se vuoi il file TAB separated anzichè comma separated, aggiungi -TABS in coda

Per leggere il file di nuovo, usa textread. Preso dall'help di textread:

To read all numeric data from a delimited text file, use a single output
argument, empty format string, and the appropriate delimiter. For
example, suppose data.csv contains:
1,2,3,4
5,6,7,8
9,10,11,12

Read the whole matrix into a single variable:
[data] = textread('data.csv','','delimiter',',');


Ciao. :)

ciao :)
io utilizzo il comando :
save <nomefile> <nomevariabile> -ASCII
il problema è che Matlab inserisce nel file di testo la fastidiosa notazione esponenziale:

cioè 0.1 lo salva come 1.0e-001
si può evitare?

bjt2
07-03-2008, 09:40
ciao :)
io utilizzo il comando :
save <nomefile> <nomevariabile> -ASCII
il problema è che Matlab inserisce nel file di testo la fastidiosa notazione esponenziale:

cioè 0.1 lo salva come 1.0e-001
si può evitare?

Mettendo -SINGLE hai 8 cifre dopo la virgola e senza notazione esponenziale (per numeri non troppo piccolo o grandi, mi pare, ma dovresti verificare). Con -DOUBLE stessa cosa, ma con 16 cifre... :)

pietro84
07-03-2008, 09:44
Mettendo -SINGLE hai 8 cifre dopo la virgola e senza notazione esponenziale (per numeri non troppo piccolo o grandi, mi pare, ma dovresti verificare). Con -DOUBLE stessa cosa, ma con 16 cifre... :)

niente :muro:
continua a mettermi la notazione esponenziale sia con l'opzione -DOUBLE che con l'opzione -SINGLE .
ho la versione 2007b

bjt2
07-03-2008, 09:52
niente :muro:
continua a mettermi la notazione esponenziale sia con l'opzione -DOUBLE che con l'opzione -SINGLE .
ho la versione 2007b

Prova a digitare FORMAT LONG G prima del SAVE... ;)

bjt2
07-03-2008, 09:54
Poi come ultima spiaggia potresti digitare:

diary('file.txt')
for i=1:7000
disp(sprintf('%.20f,', matrice(i,: )))
end
diary off

pietro84
07-03-2008, 11:05
Prova a digitare FORMAT LONG G prima del SAVE... ;)

nulla da fare.. un'altra alternativa sarebbe di usare il comando fprintf ... ora provo con questa o scrivo un apposito programmino C.
usando diary mi stampa anche altra immondizia come gli stessi comandi che digito.

bjt2
07-03-2008, 11:09
nulla da fare.. un'altra alternativa sarebbe di usare il comando fprintf ... ora provo con questa o scrivo un apposito programmino C.
usando diary mi stampa anche altra immondizia come gli stessi comandi che digito.

Devi fare uno script (un file .m)... ;) Però l'idea del fprintf è migliore... Solo che è un po' più lungo: ci vuole il doppio for e devi dare un fprintf(fid,'\n') alla fine di ogni riga... ;)

pietro84
07-03-2008, 11:20
Devi fare uno script (un file .m)... ;) Però l'idea del fprintf è migliore... Solo che è un po' più lungo: ci vuole il doppio for e devi dare un fprintf(fid,'\n') alla fine di ogni riga... ;)

anche se faccio un script mi stampa cmq i comandi disp(matrice(1,1)) e diary off , cmq ora opto per il comando fprintf... grazie per l'aiuto :)