static void t_rvq_index()
{
ifstream ss;
string ttemp = parameters_path + "new_features.txt";
ss.open(ttemp.c_str());
float * psift = (float*)malloc(sizeof(float));
int totalsift=0;
/**frame_id,以及对应的 num of sift, sift id*/
int framelabel, nsift, siftlabel;//dimension
float varfloat;
while(ss>>framelabel)
{
ss>>nsift;
psift = (float*)realloc(psift, (totalsift+nsift)*(sift_dimension)*sizeof(float));//不断重新分配内存
/**
原型:extern void *realloc(void *mem_address, unsigned int newsize);
语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
新的大小一定要大于原来的大小不然的话会导致数据丢失!
功能:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,
如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放
原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。*/
for(int i=0;i<nsift;i++)
{
ss>>siftlabel;
ss>>varfloat;
ss>>varfloat;
ss>>varfloat;
for(int j=0;j<sift_dimension;j++)
{
ss>>psift[ (totalsift+i)*(sift_dimension) + j ];
}
}
totalsift += nsift;
}
total_rvq = new RVQ(rvq_code_level, rvq_ncentroids, sift_dimension, 0);//
total_rvq->rvq_learn_codebook(totalsift, sift_dimension, psift);
ttemp = parameters_path + "sift_rvq_codebook.txt";
total_rvq->rvq_codebook_write(ttemp.c_str());
delete total_rvq;
total_rvq=0;
free(psift);
ss.close();
}
realloc函数
最新推荐文章于 2022-04-23 18:09:37 发布