Effacer les filtres
Effacer les filtres

memmapfile and alternative data formats (char, complex, etc.)

6 vues (au cours des 30 derniers jours)
D. Plotnick
D. Plotnick le 11 Avr 2017
This is both a request for expanded Matlab capabilities in future versions, and a question as to whether better methods than used below exist. I am attempting to use 'memmapfile' to read large binary files that have a custom header. Most of the data formats are standard (uint32,double, etc.) but there are a few that were written in formats not currently supported by memmapfile. E.g. as 'char' by a client using python. The payload itself is a complex64 (complex single) which is readable from Python.
(1) How can I read 'char' properly? Right now I have them just reading in as uint8's to get the correct size, so I either need to reinterpret them as 'char' (how?) or to read them as chars directly.
(2) How can I read a complex? Right now, the assumption (correct for this set) that each complex64 is really a pair of singles in the order [real, imag]. Thus, I can recreate the complex single using something of the form
dat = m.Data(1:2:end) + 1i*m.Data(2:2:end)
where m is my memory map. This works...but is so cludgy feeling that I wonder if there is a better way.
Regardless, expanding the supported formats for memmapfile would be appreciated.
Thanks, -Dan

Réponse acceptée

Vandana Ravichandran
Vandana Ravichandran le 14 Avr 2017
"memmapfile" currently supports int/uint (different variants), single, double data types. You can use char and complex with "memapfile" in the following way -
1. "char"
% Create Data
myData = 'This is a string';
% Write char data to file
fileID = fopen('records.dat','w');
fwrite(fileID, myData,'char');
fclose(fileID);
% memmapfile read data
>> m = memmapfile('records.dat');
>> data = char(m.Data)';
2. "complex"
% Create Data
complexData = complex([1:10],[20:-1:11]);
realData = real(complexData);
imaginaryData = imag(complexData);
interleavedData = reshape([realData;imaginaryData],[],1);
% Write complex data to file
fid = fopen('complexData.dat','w');
fwrite(fid, interleavedData, 'double');
fclose(fid);
% MEMMAPFILE - formats data into 2 rows of 10 elements each
m = memmapfile('complexData.dat', 'Offset', 0, 'Format', {'double' [2,10] 'x'});
complexValues = complex(m.Data(:).x(1,:), m.Data(:).x(2,:));

Plus de réponses (0)

Catégories

En savoir plus sur Standard File Formats dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by