Changeset 12006
- Timestamp:
- 05/19/08 23:22:11 (7 months ago)
- Files:
-
- 1 modified
-
lang/cplusplus/misc/clustercpp/src/ward.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/cplusplus/misc/clustercpp/src/ward.cpp
r11746 r12006 126 126 double mindist=-1.0; 127 127 INDEX minj =0; 128 std::set<INDEX>::iterator kietaend = kieta.end(); 129 128 130 for(INDEX j=0;j<nextnodenum; j++){ 129 if(kieta.find(j) != kieta .end()){131 if(kieta.find(j) != kietaend){ 130 132 continue; //すでに消えてるなら何もしない 131 133 } … … 137 139 (*mat)[j]->erase(p); //今後使わなくなる成分の消去 138 140 }else{ 139 tmpdist = (*objp)[j] =((sp+sizes[j])*elm(j,p)+(sq+sizes[j])*elm(j,q)-sizes[j]*mqp)/(sqp+sizes[j]); 141 tmpdist = (*objp)[j] =((sp+sizes[j])*elm(j,p)+(sq+sizes[j])*elm(j,q)-sizes[j]*mqp)/(sqp+sizes[j]); 140 142 (*mat)[j]->erase(p); //今後使わなくなる成分の消去 141 143 (*mat)[j]->erase(q); //今後使わなくなる成分の消去 … … 145 147 minj=j; 146 148 } 147 if(hasrow(j)){ 149 if(hasrow(j)){ //Q. この判定必要? A. 必要。まだ合体させられてないのに、matの行自体は消えていることがあるよ。 148 150 if((*mat)[j]->size()==0){ 149 151 caches->erase(j); 150 152 mat->erase(j); 153 //一見ここでkieta.insert(j)したくなるが、そうしてはいけない! 154 //kietaにinsertするのは、真にその点が消えた時=他の点と合体させられた時のみである。 155 //そうでないのにここでinsertしてしまうと、まだ消滅していないのに、未来永劫計算対象からはずされてしまうのだっ!! 151 156 }else{ 152 Cache & c=*(getcache(j));153 if(c .index==p || c.index==q){157 CacheP c = getcache(j); 158 if(c->index==p || c->index==q){ 154 159 MATRIXROW::iterator it = std::min_element((*mat)[j]->begin(), (*mat)[j]->end(), compmatrow()); 155 160 savecache(j, it->second, it->first);
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)