Changeset 1463b2e in tol


Ignore:
Timestamp:
Dec 10, 2009, 11:03:28 AM (17 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
f7f325b
Parents:
cbeed2c
Message:

New optional argument of built-in function Sort to allow unique results

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@1775 be4846ae-f051-483a-831f-b64e7d08527f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/matrix_type/matgra.cpp

    rcbeed2c r1463b2e  
    65536553  static const BArray<int>*   criterium_;
    65546554 public:
    6555   static int Compare(const void* v1, const void* v2)
    6556   {
    6557     int i1 = *(int*)v1;
    6558     int i2 = *(int*)v2;
     6555  static int CompareValue(int i1, int i2)
     6556  {
    65596557    int k,j,h;
    65606558    for(k=0; k<criterium_->Size(); k++)
    … …  
    65806578    return(0);
    65816579  }
     6580  static int Compare(int i1, int i2)
     6581  {
     6582    int cmp = CompareValue(i1,i2);
     6583    if(!cmp) { cmp = i1-i2;}
     6584    return(cmp);
     6585  }
     6586
     6587  static int Compare(const void* v1, const void* v2)
     6588  {
     6589    return(Compare(*(int*)v1,*(int*)v2));
     6590  }
    65826591  static void Sort(const BMatrix<BDat>& mat,
    65836592            const BArray<int>& criterium,
    … …  
    66016610  //--------------------------------------------------------------------
    66026611  DeclareContensClass(BMat, BMatTemporary, BMatSort);
    6603   DefExtOpr(1, BMatSort, "Sort", 2, 2, "Matrix Set",
    6604   "(Matrix mat, Set criterium)",
     6612  DefExtOpr(1, BMatSort, "Sort", 2, 3, "Matrix Set Real",
     6613  "(Matrix mat, Set criterium [, Real unique])",
    66056614  I2("Sorts rows of a matrix given a mixed criterium of ascent or "
    66066615     "descent columns. For example, criterium=[[-2,3]] sorts by 2-nd "
    … …  
    66206629  BMat& m = Mat(Arg(1));
    66216630  BSet& c = Set(Arg(2));
     6631  bool unique = false;
     6632  if(Arg(3))
     6633  {
     6634    unique = Real(Arg(3))!=0.0;
     6635  }
    66226636  BArray<int> c_(c.Card());
    66236637  BArray<int> p(m.Rows());
    6624   contens_.Alloc(m.Rows(),1);
    66256638  int j,k;
    66266639  bool ok=true;
    … …  
    66466659  }
    66476660  BMatOrder::Sort(m,c_,p);
    6648   for(k=0;k<m.Rows();k++)
    6649   {
    6650     contens_(k,0)=p[k]+1;
    6651   }
    6652 }
     6661  if(!unique)
     6662  {
     6663    contens_.Alloc(m.Rows(),1);
     6664    for(k=0;k<m.Rows();k++)
     6665    {
     6666      contens_(k,0)=p[k]+1;
     6667    }
     6668  }
     6669  else
     6670  {
     6671    int d=1;
     6672    BArray<int> cmp(m.Rows());
     6673    cmp[0]=1;
     6674    for(k=1;k<m.Rows();k++)
     6675    {
     6676      if(cmp[k]=BMatOrder::CompareValue(p[k-1],p[k])) { d++; }
     6677    }
     6678    contens_.Alloc(d,1);
     6679    for(k=d=0;k<m.Rows();k++)
     6680    {
     6681      if(cmp[k])
     6682      {
     6683        contens_(d,0)=p[k]+1;
     6684        d++;
     6685      }
     6686    }
     6687  }
     6688}
     6689
    66536690
    66546691//--------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.