- 1、本文档共20页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
libsvm-284 源代码分析
?libsvm-2.84 源代码分析(一)——cache类收藏
/*=============================================libsvm 2.84 代码分析
分析模块:cache类
分析者:ByronE-Mail: byronm@分析日期:2007年8月2日
==============================================*///// Kernel Cache//// l is the number of total data items// size is the cache size limit in bytes//class Cache{public:?Cache(int l,long int size); ?//构建Cache的参数,包含l(数据个数)和size(空间大小)?????// l is the number of total data items?????// size is the cache size limit in bytes?~Cache();//析构函数
?// request data [0,len)?// return some position p where [p,len) need to be filled?// (p = len if nothing needs to be filled)?int get_data(const int index, Qfloat **data, int len);//读取数据?void swap_index(int i, int j);?// future_optionprivate:?int l;?long int size;
?struct head_t???{??head_t *prev, *next;?// a cicular list 双向链表??Qfloat *data;??int len;??// data[0,len) is cached in this entry?};
?head_t *head;????head_t lru_head;?void lru_delete(head_t *h);?void lru_insert(head_t *h);};
//cache保证索引结构的大小,余下的大小用来存放数据//size最后被修改为可以存放Qfloat类型数据的大小Cache::Cache(int l_,long int size_):l(l_),size(size_){?head = (head_t *)calloc(l,sizeof(head_t));?//initialized to 0,分配所有数据结构所需内存(地址连续)?size /= sizeof(Qfloat);????//Qfloat 类型的个数,(size 的 意义已经由数据空间大小变为数据个数)?size -= l * sizeof(head_t) / sizeof(Qfloat);?//除结构体所占用的空间外,剩下用于存放数据的个数?size = max(size, (long int) 2*l);??//cache must be large enough for two columns?lru_head.next = lru_head.prev = lru_head;}
Cache::~Cache()//释放内存数据区,然后释放结构{?for(head_t *h = lru_head.next; h != lru_head; h=h-next)??free(h-data);?free(head);}
void Cache::lru_delete(head_t *h){?// delete from current location?h-prev-next = h-next;?h-next-prev = h-prev;}
//循环链表插入void Cache::lru_insert(head_t *h){?// insert to last position?h-next = lru_head;?h-prev = lru_head.prev;?h-prev-next = h;?h-next-prev = h;}
// request data [0,len)// return some position p where [p,len) need to be filled
// (p = len if nothing needs to be filled)?//返回cache的
文档评论(0)