在 Matlab 中读取和写入二进制文件
Posted
技术标签:
【中文标题】在 Matlab 中读取和写入二进制文件【英文标题】:Read and write from/to a binary file in Matlab 【发布时间】:2010-09-17 08:54:16 【问题描述】:我对matlab的了解只是基于需要知道,所以这可能是一个基本的问题。然而它来了:
我有一个文件,其中包含以二进制格式存储的数据(16 位整数)。如何将它读入matlab中的向量/数组?如何将这些数据写入 matlab 中的文件?在读取/写入大量数据(千兆字节)时,是否有任何智能调整来提高性能速度?
【问题讨论】:
【参考方案1】:正如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.
fopen 和 fread 命令默认为整数的 Little-endian[1] 编码。如果您的文件是大端编码的,您需要将 fread 更改为
>> A = fread(fid, count, 'int16', 'ieee-be');
另外,如果你想读取整个文件集
>> count=inf;
如果您想将数据读入具有 n 列的矩阵,请使用
>> count=[n inf];
写入数据
至于将数据写入文件。 Bill's 答案中的命令 fwrite 将写入二进制文件。如果要将数据写入文本文件,可以使用 dlmwrite
>> dlmwrite('data.csv',A,',');
参考文献
[1]http://en.wikipedia.org/wiki/Endianness
更新
机器格式(IE,ieee-be, ieee-le、vaxd 等)的二进制数据可以在任一 fopen 或 Matlab 中的 fread 命令。支持的详细信息 机器格式可以在 Matlab 的 fopen 文档。
Scott French's 评论Bill's answer 建议将数据读入 int16 变量。为此,请使用
>> A = int16(fread(fid,count,precision,machineFormat));
其中 count 是 要读取的数据,precision 是 数据格式和机器格式 是每个字节的编码。
查看命令fseek 来移动文件。例如,
>> fseek(fid,0,'bof');
将文件倒回到 bof 代表文件开头的开头。
【讨论】:
【参考方案2】:假设您知道文件中存储了多少个值,您可以执行以下操作将数据读入数组。
fid = fopen('data.bin','rb')
A = fread(fid, count, 'int16')
要将数据写入文件,请执行以下操作:
fid = fopen('data.bin','w')
count = fwrite(fid, A, 'int16')
fwrite 函数返回写入文件的元素数(不是字节数)。
就性能调优而言,您可以分块读取数据,只使用您需要处理的数据。这在任何语言中都是一样的,没有办法加快它特定于 Matlab 的速度。
【讨论】:
请注意,fread 的 'int16' 参数会将数据读取为 int16,但会将它们中的每一个都提高到双精度,这可能会对性能造成重大影响。根据您对数据的处理,您可能希望使用“*int16”,它将 int16 读入 int16 类型的变量。【参考方案3】:我通常讨厌在回复中看到链接,但这看起来非常接近:
http://www.mathworks.com/support/tech-notes/1400/1403.html
关于性能调优的第二部分,我用Matlab已经6年了,所以不知道。
HTH
【讨论】:
以上是关于在 Matlab 中读取和写入二进制文件的主要内容,如果未能解决你的问题,请参考以下文章