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)?

È stato utile?

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

  1. 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.

  2. 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.

  3. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top