Pregunta

Mi conocimiento de matlab es simplemente una necesidad de saberlo, por lo que esta es probablemente una pregunta elemental. Sin embargo aquí viene:

Tengo un archivo que contiene datos (enteros de 16 bits) almacenados en formato binario. ¿Cómo lo leo en un vector / una matriz en matlab? ¿Cómo escribo estos datos en un archivo en matlab? ¿Hay algún ajuste inteligente para aumentar la velocidad de rendimiento al leer / escribir una gran cantidad de datos (gigabytes)?

¿Fue útil?

Solución

Como escribió Bill the Lizard puede utilizar fread para cargar los datos en un vector. Solo quiero ampliar un poco su respuesta.

Lectura de datos

>> fid=fopen('data.bin','rb') % opens the file for reading
>> A = fread(fid, count, 'int16') % reads _count_ elements and stores them in A.

Los comandos fopen y fread están predeterminados para la codificación de Little-endian [1] para los enteros. Si su archivo está codificado en Big Endian, deberá cambiar el fread a

>> A = fread(fid, count, 'int16', 'ieee-be');

Además, si desea leer el conjunto de archivos completo

>> count=inf;

y si desea leer los datos en matriz con n utilizar columnas

>> count=[n inf];

Escribiendo datos

En cuanto a la conexión de los datos a un archivo. El comando, fwrite , en La respuesta de Bill se escribirá en un archivo binario. Si desea escribir los datos en un archivo de texto, puede usar dlmwrite

>> dlmwrite('data.csv',A,',');

Referencias

[1] http://en.wikipedia.org/wiki/Endianness

Actualizar

  1. El formato de la máquina (IE, ieee-be , ieee-le , vaxd etc.) de los datos binarios se puede especificar en la fopen o los comandos fread en Matlab. Detalles de los apoyados. El formato de la máquina se puede encontrar en La documentación de Matlab sobre fopen .

  2. el comentario de Scott French al Bill's responder sugiere leer los datos en una variable int16 Para ello utiliza

    >> A = int16(fread(fid,count,precision,machineFormat));
    

    donde cuenta es el tamaño / forma de los datos a leer, precisión es el formato de datos, y machineformat es la codificación de cada byte.

  3. Vea los comandos fseek para moverse por el archivo. Por ejemplo,

    >> fseek(fid,0,'bof');
    

    rebobinará el archivo al principio donde bof significa principio de archivo .

Otros consejos

Suponiendo que sabes cuántos valores has almacenado en el archivo, puedes hacer algo como esto para leer los datos en una matriz.

fid = fopen('data.bin','rb')
A = fread(fid, count, 'int16')

Para escribir datos en un archivo, haz esto:

fid = fopen('data.bin','w')
count = fwrite(fid, A, 'int16')

La función fwrite devuelve el número de elementos (no bytes) escritos en el archivo.

En lo que respecta a la optimización del rendimiento, puede leer los datos en fragmentos para usar solo la cantidad necesaria para procesar. Esto es lo mismo en cualquier idioma, y ??no hay manera de acelerarlo, eso es específico de Matlab.

Por lo general, odio ver los enlaces en una respuesta, pero esto se ve bastante cerca:

http://www.mathworks.com/support/tech -notes / 1400 / 1403.html

En cuanto a la segunda parte de la optimización del rendimiento, hace 6 años que no uso Matlab, así que no sé.

HTH

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top