在大数据时代,特别是近似最近邻搜索(ANN)领域,经常会遇到一些标准基准数据集,比如SIFT1M、GIST1M或Deep1B。这些数据集通常以二进制格式存储,其中最常见的一种就是fvecs格式。fvecs是一种简单的二进制向量存储格式,每个向量由一个整数(表示维度d)开头,后面紧跟d个单精度浮点数(float32)。这种格式存储紧凑,读取速度快,非常适合大规模向量数据。
如果直接用MATLAB的fread读取这种格式,需要小心处理每个向量开头的维度整数,否则容易出错。今天我们来分享一个高效、健壮的MATLAB函数,用于读取fvecs文件,支持读取全部向量、指定数量向量或指定范围的向量。
fvecs格式详解
一个fvecs文件的内容结构如下:
向量1: [d (int32)] + [float32 × d]
向量2: [d (int32)] + [float32 × d]
…
每个向量的开头都是一个int32的维度值d,后面紧跟d个float32的特征值。所有向量通常维度相同(文件中每个d应该一致)。
整个文件大小 = 向量数量 × (4 + d × 4) 字节。
函数设计目标
我们希望实现一个函数fvecs_read,支持三种调用方式:
v = fvecs_read(filename)→ 读取文件中所有向量