![]() |
|
leggere e scrivere i dati in octave e matlab
Per salvare i dati in un file si puo' usare in octave il comando save e per leggerli load
x=[-1:0.1:1];
y=x.^3;
plot(x,y);
size(x);
save prova x y
Questo crea un file prova che contiene non solo x e y ma anche dei metadati che specificano che x e y sono vettori.
Attenzione ad usare solo spazi bianche come separatori e a non mettere spazi o caratteri strani nel nome file...
Matlab non riesce a leggere questo file.
Per recuperare i dati in octave:
load prova
size(x)
size(y)
plot(x,y)
Proviamo ora a cancellare i metadati dal file; ora octave non conosce i nomi delle due variabili ma legge ugualmente il file:
load prova
size(prova)
plot(prova(1,:),prova(2,:))
Questa volta il file viene letto anche da Matlab, con gli stessi comandi.
Cosa succede se usiamo il comando save in Matlab ?
Matlab crea un file binario prova.mat comprensivo dei metadati.
Sia Matlab che octave possono leggerlo ricostruendo i due vettori x e y.
In Matlab si possono dare comunque le opzioni -ASCII e -DOUBLE:
x=[-1:0.1:1];
y=x.^3;
plot(x,y);
size(x);
save prova x y -ASCII -DOUBLE
Notare che questa volta il file viene salvato col nome prova.
Infine octave può usare le forme funzionali dei due comandi, cioè del tipo:
save("prova","x","y")
Funzioni più complete sono fread e fwrite che hanno sintassi simile al C, ma che
richiedono maggiori accortezze sopratutto per quel che riguarda le strutture e le precisioni dei dati
da manipolare.
Per esempio per scrivere e poi leggere un vettore x di 21 numeri in doppia precisione, usando il Matlab (o octave),
posso dare questi comandi:
ff=fopen('prova','w')
x=[-1:0.1:1];
size(x)
fwrite(ff,x,'double')
fclose(ff)
ff=fopen('prova','r')
[x,n]=fread(ff,inf,'double',0,'l');
x
Si noti che Matlab usa l'apice singolo e non doppio comune su octave, e che si è dovuto specificare
che i numeri sono in doppia precisione; in certi casi occorre specificare perfino l'architettura (little endian o big endian);
inf è va sostituito con le esatte dimensioni oppure viene letto un unico vettore di numeri.
Se si trascura di specificare la doppia precisione i numeri vengono letti errati (provare). Come pure succede se non
si specificano le dimensioni di una matrice, tipo [2 7].
Per esempio nel file prova abbiamo salvato una matrice di float in doppia precisione di dimensione 5x6.
Provare a leggerla: la prima riga dovrebbe essere:
0.334531 0.916313 0.697982 0.058510 0.624011 0.958059
![]() |
|