Changeset f033837 in tol


Ignore:
Timestamp:
Nov 23, 2008, 5:37:53 PM (18 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
5eda391
Parents:
eed59b2
Message:

New built-in function Sort

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

File:
1 edited

Legend:

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

    reed59b2 rf033837  
    63466346}
    63476347
     6348//--------------------------------------------------------------------
     6349class BMatOrder
     6350//--------------------------------------------------------------------
     6351{
     6352 private:
     6353  static const BMatrix<BDat>* mat_;
     6354  static const BArray<int>*   criterium_;
     6355 public:
     6356  static int Compare(const void* v1, const void* v2)
     6357  {
     6358    int i1 = *(int*)v1;
     6359    int i2 = *(int*)v2;
     6360    int k,j,h;
     6361    for(k=0; k<criterium_->Size(); k++)
     6362    {
     6363      h = (*criterium_)[k];
     6364      if(h>0)
     6365      {
     6366        j=h-1;
     6367        const BDat& m1 = (*mat_)(i1,j);
     6368        const BDat& m2 = (*mat_)(i2,j);
     6369        if(m1<m2) { return(-1); }
     6370        if(m1>m2) { return(+1); }
     6371      }
     6372      else
     6373      {
     6374        j=-h-1;
     6375        const BDat& m1 = (*mat_)(i1,j);
     6376        const BDat& m2 = (*mat_)(i2,j);
     6377        if(m1<m2) { return(+1); }
     6378        if(m1>m2) { return(-1); }
     6379      }
     6380    }
     6381    return(0);
     6382  }
     6383  static void Sort(const BMatrix<BDat>& mat,
     6384            const BArray<int>& criterium,
     6385            BArray<int>& perm)
     6386  {
     6387    mat_ = &mat;
     6388    criterium_ = &criterium;
     6389    int i;
     6390    perm.AllocBuffer(mat.Rows());
     6391    for(i=0;i<perm.Size();i++)
     6392    {
     6393      perm[i]=i;
     6394    }
     6395    perm.Sort(Compare);
     6396  }
     6397};
     6398
     6399const BMatrix<BDat>* BMatOrder::mat_ = NULL;
     6400const BArray<int>*   BMatOrder::criterium_ = NULL;
     6401 
     6402  //--------------------------------------------------------------------
     6403  DeclareContensClass(BMat, BMatTemporary, BMatSort);
     6404  DefExtOpr(1, BMatSort, "Sort", 2, 2, "Matrix Set",
     6405  "(Matrix mat, Set criterium)",
     6406  I2("Sorts rows of a matrix given a mixed criterium of ascent or "
     6407     "descent columns. For example, criterium=[[-2,3]] sorts by 2-nd "
     6408     "column descent and 3-th one ascent in case of tie."
     6409     "Returns the permutation matrix p such that PivotByRows(mat,p) "
     6410     "is the sorted matrix.",
     6411     "Ordena las filas de una matriz dado un criterio mezclado de "
     6412     "columnas ascendentes y descendentes. Por ejemplo, criterium="
     6413     "[[-2,3]] ordena por la segunda columna descendente y por la "
     6414     "tercera ascendente en caso de empate."
     6415     "Devuelve la matriz de permutación tal que PivotByRows(mat,p) "
     6416     "es la matriz ordenada."),
     6417     BOperClassify::Statistic_);
     6418  void BMatSort::CalcContens()
     6419//--------------------------------------------------------------------
     6420{
     6421  BMat& m = Mat(Arg(1));
     6422  BSet& c = Set(Arg(2));
     6423  BArray<int> c_(c.Card());
     6424  BArray<int> p(m.Rows());
     6425  contens_.Alloc(m.Rows(),1);
     6426  int j,k;
     6427  bool ok=true;
     6428  double x;
     6429  for(k=0; k<c.Card(); k++)
     6430  {
     6431    ok=false;
     6432    if(c[k+1]->Grammar()==GraReal())
     6433    {
     6434      x = Real(c[k+1]);
     6435      c_[k]=(int)x;
     6436      j=abs(c_[k]);
     6437      if((x==c_[k])&&(1<=j)&&(j<=m.Columns()))
     6438      {
     6439        ok=true;
     6440      }
     6441      if(!ok)
     6442      {
     6443        Error(BText("[Matrix Sort] Wrong criterium order field number ")+
     6444          (k+1)+": "+c[k+1]->Identify());
     6445      }
     6446    }
     6447  }
     6448  BMatOrder::Sort(m,c_,p);
     6449  for(k=0;k<m.Rows();k++)
     6450  {
     6451    contens_(k,0)=p[k]+1;
     6452  }
     6453}
     6454
    63486455#ifdef __USE_DEPRECATED_LINALG_METHOD__
    63496456//--------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.