我对matlab的了解仅仅是需要了解基础,所以这可能是一个基本问题。不过它来了:

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

有帮助吗?

解决方案

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]编码。如果您的文件是Big-endian编码,则需要将 fread 更改为

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

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

>> count=inf;

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

>> count=[n inf];

编写数据

关于将数据传送到文件。 fwrite > Bill的答案将写入二进制文件。如果要将数据写入文本文件,可以使用 dlmwrite

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

参考

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

更新

  1. 机器格式(IE, ieee-be , 二进制数据的 ieee-le vaxd 等)可以在 在Matlab中 fopen fread 命令。支持的详细信息 机器格式可以在 Matlab的 fopen 文档。

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

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

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

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

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

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

其他提示

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

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

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

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

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

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

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

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

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

HTH

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top