Changeset f033837 in tol
- Timestamp:
- Nov 23, 2008, 5:37:53 PM (18 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- 5eda391
- Parents:
- eed59b2
- File:
-
- 1 edited
-
tol/btol/matrix_type/matgra.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
tol/btol/matrix_type/matgra.cpp
reed59b2 rf033837 6346 6346 } 6347 6347 6348 //-------------------------------------------------------------------- 6349 class 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 6399 const BMatrix<BDat>* BMatOrder::mat_ = NULL; 6400 const 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 6348 6455 #ifdef __USE_DEPRECATED_LINALG_METHOD__ 6349 6456 //--------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.
