2016-07-21 2 views
1

Der Zweck besteht darin, Daten aus Matlab verlustfrei zu speichern und auszutauschen. Um zum Beispiel eine Doppel Array gegeben:Wie kann man hexadezimale doppelte Daten aus einer Datei effizient einlesen?

>> a 
a(:,:,1) = 
    0.8147 0.1270 0.6324 
    0.9058 0.9134 0.0975 
a(:,:,2) = 
    0.2785 0.9575 0.1576 
    0.5469 0.9649 0.9706 

wir die Daten als Hexadezimal-Format in eine Datei

fp = fopen('test.dat','w'); 
fprintf(fp, '%bX ',a); 

und bekommen

3FEA1237688ABA7B 3FECFC3F5F570C7D 3FC0411A9F807B7C 3FED3A6000E256BF 3FE43C49753B9024 3FB8F8687182D4C0 3FD1D2EA3181CE68 3FE1800DABF8B5E0 3FEEA3E55FFC605B 3FEEE05DEBDEEB6B 3FC42CAA5B9D0950 3FEF0F1897ECA804 

wiederum speichern können, müssen wir diese lesen Daten in Matlab korrekt. In fscanf() gibt es jedoch kein entsprechendes "% bX" -Format. Ich habe gesucht und konnte es one-by-one:

for k = 1 : xx 
    tmp = fscanf(fp,'%s ',[1 1]); 
    b(k) = hex2num(tmp); 
end 

Da es nicht effizient ist vor allem für große Daten, wie in diesen Daten in Matlab effizient zu lesen?

Antwort

3

Anstatt Looping, ich würde einfach die gesamte Datei lesen fread in Verwendung, spaltete es in allen Räumen strsplit unter Verwendung einer Zelle Array von Strings zu schaffen, wo jeder Hexadezimalzahl ein Element ist, und dann hex2num verwenden, um jedes Element von hexadezimal zu konvertieren zu einem Doppel.

fid = fopen('filename.dat', 'r'); 
numbers = hex2num(strsplit(fread(fid, '*char').')); 
fclose(fid); 

aktualisieren

Wenn Sie nicht strsplit haben, können Sie regexp verwenden Sie die Spaltung zu tun.

numbers = hex2num(regexp(fread(fid, '*char').', '\s+', 'split')); 

und eine andere Option ist textscan zu nutzen, um unsere jeder Hexadezimalzahl

data = textscan(fid, '%s'); 
numbers = hex2num(data{1}); 
+0

danke zu analysieren. Es scheint, dass die Funktion strsplit() nur in der neuen Version Matlab existiert. – lxg

+0

@lxg Aktualisiert mit einer Alternative für ältere Versionen. – Suever

+0

danke! es ist jetzt sehr schnell. – lxg

Verwandte Themen