在 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.

fopenfread 命令默认为整数的 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-beieee-levaxd 等)的二进制数据可以在任一 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 中读取和写入二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

如何快速读取二进制文件

C++怎么把文件读取成16进制的,显示出来,或者16进制的写入文件.

Java读取二进制文件 乱码 求大神帮忙

用C++写的二进制文件,用JAVA怎么读取?

请教c#读取二进制文件的问题

用C++写的二进制文件,用JAVA怎么读取?