数据读取中实例一
ANN_SIFT数据地址
文件内容格式
field | field type | description |
---|---|---|
d | int | the vector dimension |
components | float *d | the vector components |
void load_data(char* filename, float*& data, unsigned& num,unsigned& dim){
// load data with sift10K pattern
//以二进制形式打开文件
std::ifstream in(filename, std::ios::binary);
//判断是否打开
if(!in.is_open()){
std::cout<<"open file error"<<std::endl;exit(-1);}
//读入4个字节
in.read((char*)&dim,sizeof(unsigned));
std::cout<<"data dimension: "<<dim<<std::endl;
//输入位置指示器设置到文件末尾,偏移0
in.seekg(0,std::ios::end);
//返回输入位置指示器
std::ios::pos_type ss = in.tellg();
//直接长度
size_t fsize = (size_t)ss;
//转化为float的和dim维度的数量,这里unsigned是总字节数,每条数据长度为(dim+1)*4
num = (unsigned)(fsize / (dim+1) / 4);
data = new float[num * dim * sizeof(float)];
//输入位置指示器设置到文件开始,偏移0
in.seekg(0,std::ios::beg);
for(size_t i = 0; i < num; i++){
//当前位置偏移4 这里读出的数量是数据维度,本数据是维度相同,所有读入第一个即可
in.seekg(4,std::ios::cur);
//读取一个dim维度float
in.read((char*)(data+i*dim),dim*sizeof(float));
}
//关闭文件
in.close();
}
改进一下
/** * @brief 加载特征全部数据 */
std::vector<std::vector<float>> load_data(const std::string &filename)
{
// load data with sift10K pattern
//以二进制形式打开文件
std::ifstream in(filename, std::ios::binary);
//判断是否打开
if (!in.is_open())
{
std::cout << "open file error" << std::endl;
exit(-1);
}
//读入4个字节,得到数据维度
unsigned dim;
in.read((char *)&dim, 4);
std::cout << "data dimension: " << dim << std::endl;
//输入位置指示器设置到文件末尾,偏移0
in.seekg(0, std::ios::end);
//返回输入位置指示器
std::ios::pos_type ss = in.tellg();
//文件长度
size_t fsize = (size_t)ss;
//单条数据长度
unsigned cell_size = dim * sizeof(float) + sizeof(int);
//算出数据条数
unsigned num = (unsigned)(fsize / cell_size);
//返回结果集合
std::vector<std::vector<float>> res;
//预留内存空间,避免push_back频繁分配内存
res.reserve(num);
//输入位置指示器设置到文件开始,偏移0
in.seekg(0, std::ios::beg);
for (size_t i = 0; i < num; i++)
{
//当前位置偏移4 这里读出的数量是数据维度,本数据是维度相同,所有读入第一个即可
in.seekg(4, std::ios::cur);
std::vector<float> tmp_data(dim);
//读取一个dim维度float
in.read((char *)(tmp_data.data()), dim * sizeof(float));
res.push_back(std::move(tmp_data));
}
//关闭文件
in.close();
return std::move(res);
}
读取正确结果数据文件
/** * @brief 加载测试集groudtruth */
std::vector<std::vector<unsigned>> load_groundtruth(const std::string &filename)
{
//以二进制形式打开文件
std::ifstream inputGT(filename, std::ios::binary);
//判断是否打开
if (!inputGT.is_open())
{
std::cout << "open file error" << std::endl;
exit(-1);
}
//读入4个字节
unsigned topk;
inputGT.read((char *)&topk, sizeof(unsigned));
std::cout << "data topk: " << topk << std::endl;
//输入位置指示器设置到文件末尾,偏移0
inputGT.seekg(0, std::ios::end);
//返回输入位置指示器
std::ios::pos_type ss = inputGT.tellg();
//文件长度
size_t fsize = (size_t)ss;
//获取单个数据长度
unsigned cell_size = (topk + 1) / sizeof(unsigned);
//计算数据个数
unsigned num = (unsigned)(fsize / cell_size);
//结果集合
std::vector<std::vector<unsigned>> massQA;
//预留内存空间,避免push_back频繁分配内存
massQA.reserve(num);
//输入位置指示器设置到文件开始,偏移0
inputGT.seekg(0, std::ios::beg);
for (unsigned i = 0; i < num; i++)
{
int t;
inputGT.read((char *)&t, 4);
std::vector<unsigned> buffer(t);
inputGT.read((char *)buffer.data(), t * sizeof(unsigned));
massQA.push_back(buffer);
}
//关闭文件
inputGT.close();
return std::move(massQA);
}
今天的文章c++中的std_std::sort[通俗易懂]分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/57750.html