15

我对matlab的了解只是在需要知道的基础上,所以这可能是一个基本的问题。然而它来了:

我有一个包含以二进制格式存储的数据(16 位整数)的文件。如何将它读入matlab中的向量/数组?如何将这些数据写入 matlab 中的文件?在读取/写入大量数据(千兆字节)时,是否有任何智能调整来提高性能速度?

4

3 回答 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默认为整数的 Little-endian[1] 编码。如果您的文件是大端编码的,您需要将fread更改为

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

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

>> count=inf;

如果您想将数据读入具有n列的矩阵,请使用

>> count=[n inf];

写入数据

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

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

参考

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

更新

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

  2. Scott French对比尔回答的评论 建议将数据读入 int16 变量。为此,请使用

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

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

  3. 请参阅命令fseek在文件中移动。例如,

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

    将文件倒回到bof代表文件开头的开头

于 2008-10-15T20:07:27.203 回答
10

假设您知道文件中存储了多少值,您可以执行类似的操作将数据读入数组。

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

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

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

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

就性能调整而言,您可以分块读取数据,只使用您需要处理的数据。这在任何语言中都是一样的,并且没有办法加快它特定于 Matlab 的速度。

于 2008-10-15T18:14:17.477 回答
0

我通常讨厌在回复中看到链接,但这看起来非常接近:

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

至于第二部分的性能调优,我用Matlab已经6年了,所以不知道。

高温高压

于 2008-10-15T18:03:27.513 回答