Leggi e scrivi da / verso un file binario in Matlab
Domanda
La mia conoscenza di matlab è semplicemente sulla necessità di conoscere le basi, quindi questa è probabilmente una domanda elementare. Tuttavia ecco che arriva:
Ho un file contenente dati (numeri interi a 16 bit) memorizzati in formato binario. Come lo leggo in un vettore / un array in matlab? Come scrivo questi dati su un file in MATLAB? C'è qualche modifica intelligente per aumentare la velocità delle prestazioni durante la lettura / scrittura di una grande quantità di dati (gigabyte)?
Soluzione
Come Bill the Lizard ha scritto puoi usare fread per caricare i dati in un vettore. Voglio solo espandere un po 'la sua risposta.
Lettura dei dati
>> fid=fopen('data.bin','rb') % opens the file for reading
>> A = fread(fid, count, 'int16') % reads _count_ elements and stores them in A.
I comandi fopen e fread hanno come impostazione predefinita la codifica Little-endian [1] per gli interi. Se il tuo file è codificato in big-endian dovrai cambiare fread in
>> A = fread(fid, count, 'int16', 'ieee-be');
Inoltre, se vuoi leggere l'intero set di file
>> count=inf;
e se vuoi leggere i dati in matrice con n usa
>> count=[n inf];
Scrittura dei dati
Per quanto riguarda l'inserimento dei dati in un file. Il comando fwrite , in La risposta di Bill verrà scritta in un file binario. Se vuoi scrivere i dati in un file di testo puoi usare dlmwrite
>> dlmwrite('data.csv',A,',');
Riferimenti
[1] http://en.wikipedia.org/wiki/Endianness
Aggiornamento
-
Il formato della macchina (IE, ieee-be , ieee-le , vaxd ecc.) dei dati binari può essere specificato in fopen o i comandi fread in Matlab. Dettagli del supportato il formato della macchina è disponibile in La documentazione di fopen di Matlab.
-
commento di Scott French a Bill rispondere suggerisce di leggere i dati in un variabile int16. Per fare questo usa
>> A = int16(fread(fid,count,precision,machineFormat));
dove conta è la dimensione / forma di i dati da leggere, precisione sono il formato dei dati e machineformat è la codifica di ciascun byte.
-
Vedi i comandi fseek per spostarti nel file. Ad esempio,
>> fseek(fid,0,'bof');
riavvolge il file all'inizio dove bof sta per inizio del file .
Altri suggerimenti
Supponendo che tu sappia quanti valori hai archiviato nel file, puoi fare qualcosa del genere per leggere i dati in un array.
fid = fopen('data.bin','rb')
A = fread(fid, count, 'int16')
Per scrivere i dati in un file, procedere come segue:
fid = fopen('data.bin','w')
count = fwrite(fid, A, 'int16')
La funzione fwrite restituisce il numero di elementi (non byte) scritti nel file.
Per quanto riguarda l'ottimizzazione delle prestazioni, è possibile leggere i dati in blocchi per utilizzare solo tutto il necessario per l'elaborazione. È lo stesso in qualsiasi lingua e non c'è modo di accelerarlo che è specifico di Matlab.
Di solito odio vedere i link in una risposta, ma questo sembra abbastanza vicino:
http://www.mathworks.com/support/tech -notes / 1400 / 1403.html
Per quanto riguarda la seconda parte della performance tuning, sono passati 6 anni da quando ho usato Matlab, quindi non lo so.
HTH