在Matlab中读写二进制文件

15

我的matlab知识只是基于需要而已,所以这可能是一个初级问题。无论如何,问题来了:

我有一个包含以二进制格式存储的数据(16位整数)的文件。 我该如何在matlab中将其读入矢量/数组中? 我该如何在matlab中将这些数据写入文件? 在读取/写入大量数据(千兆字节)时有没有什么聪明的技巧来提高性能速度?

3个回答

16

正如Bill the Lizard所说,你可以使用fread将数据加载到向量中。我只想在他的回答上稍作扩展。

读取数据

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

命令fopenfread默认使用小端[1]编码来处理整数。如果您的文件使用大端编码,则需要将fread更改为

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

此外,如果您想阅读整个文件集

>> count=inf;

如果您想将数据读入具有n列的矩阵中,请使用以下代码:

and if you want to read the data into matrix with n columns use

>> count=[n inf];

写入数据

关于将数据写入文件。在Bill的回答中,命令fwrite将写入二进制文件。如果要将数据写入文本文件,则可以使用dlmwrite

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

参考文献

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

更新

  1. 在Matlab的fopenfread命令中可以指定二进制数据的机器格式(例如ieee-beieee-levaxd等)。支持的机器格式的详细信息可以在Matlab的fopen文档中找到。

  2. Scott FrenchBill的回答下的评论建议将数据读入int16变量中。要做到这一点,请使用:

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

其中count表示要读取的数据的大小/形状,precision表示数据格式,machineformat表示每个字节的编码方式。

  • 查看命令fseek以在文件中移动。例如,

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

    将文件倒回到开头,其中bof代表文件开头


  • 10

    假设您知道文件中存储了多少值,您可以像这样将数据读入数组中。

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

    要将数据写入文件,请执行以下操作:

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

    fwrite函数返回写入文件的元素数量(而不是字节数)。

    在性能调优方面,您可以按块读取数据,只使用所需处理的数据量。这在任何语言中都适用,并且没有特定于Matlab的加速方法。


    1
    请注意,fread函数中的'int16'参数将数据读取为int16,但会将每个值扩展为双精度浮点数,这可能会对性能造成重大影响。根据您对数据的处理方式,您可能需要使用'*int16',它将int16读入int16类型的变量中。 - SCFrench

    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接