Changeset 12006

Show
Ignore:
Timestamp:
05/19/08 23:22:11 (7 months ago)
Author:
ayu
Message:
  • aded comment. etc.
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/cplusplus/misc/clustercpp/src/ward.cpp

    r11746 r12006  
    126126      double mindist=-1.0; 
    127127      INDEX minj =0; 
     128      std::set<INDEX>::iterator kietaend = kieta.end(); 
     129             
    128130      for(INDEX j=0;j<nextnodenum; j++){ 
    129         if(kieta.find(j) != kieta.end()){ 
     131        if(kieta.find(j) != kietaend){ 
    130132          continue; //すでに消えてるなら何もしない 
    131133        } 
     
    137139          (*mat)[j]->erase(p);  //今後使わなくなる成分の消去 
    138140        }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]);       
    140142          (*mat)[j]->erase(p); //今後使わなくなる成分の消去 
    141143          (*mat)[j]->erase(q); //今後使わなくなる成分の消去 
     
    145147          minj=j; 
    146148        } 
    147         if(hasrow(j)){ 
     149        if(hasrow(j)){ //Q. この判定必要? A. 必要。まだ合体させられてないのに、matの行自体は消えていることがあるよ。 
    148150          if((*mat)[j]->size()==0){ 
    149151            caches->erase(j); 
    150152            mat->erase(j); 
     153            //一見ここでkieta.insert(j)したくなるが、そうしてはいけない! 
     154            //kietaにinsertするのは、真にその点が消えた時=他の点と合体させられた時のみである。 
     155            //そうでないのにここでinsertしてしまうと、まだ消滅していないのに、未来永劫計算対象からはずされてしまうのだっ!! 
    151156          }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){ 
    154159              MATRIXROW::iterator it = std::min_element((*mat)[j]->begin(), (*mat)[j]->end(), compmatrow()); 
    155160              savecache(j, it->second, it->first);