Example #1
0
 // OPT: don't create a new FacetComplex, use a non modifying alg on the old one
 bool FacetComplex::AreConnected_new(const facet& g1,const facet& g2)const
 {
   if (g1.IamEmpty() || g2.IamEmpty()) return false;
   if (g1==g2 || AreDirectlyConnected(g1,g2)) return true;
   if (this->mySize()==2) return false;// they are 2, they are not directly connected, they are not connected
   unsigned int g1_index=myGetIndex(g1);
   unsigned int g2_index=myGetIndex(g2);
   vector<unsigned int> P,P1;
   for (unsigned int i=0;i!=mySize();++i)
     P.push_back(i);
   list<unsigned int> xj;
   vector<unsigned int> g;
   for (unsigned int j=0;j!=myNumIndets();++j)
   {
     myMakeXj(xj,j);
     if (xj.size()>1)
     {
       myMakeG(g,P,xj);
       P1.clear();
       for (vector<unsigned int>::const_iterator it1=P.begin();it1!=P.end();++it1)
         P1.push_back(g[P[*it1]]);
      P1.swap(P);
     }//if
   }//for
   return (P[g1_index]==P[g2_index]);
  }// AreConnected_new
Example #2
0
 // For use in re_connected_new
  void FacetComplex::myMakeG(vector<unsigned int>& theL,
                        const vector<unsigned int>& P,
                        const list<unsigned>& xj)const
 {

   theL.clear();
   bool found_x=false;
   if (xj.empty())
   {
     for (unsigned int i=0;i!=mySize();++i)
       theL.push_back(i);
     return;
   }//if
   unsigned int x=xj.front();
   for (vector<unsigned int>::const_iterator it=P.begin();it!=P.end();++it)
   {
     found_x=false;
     for (list<unsigned int>::const_iterator it1=xj.begin();it1!=xj.end();++it1)
     {
       if (P[*it1]==*it)
         {found_x=true;break;}
     }//for
     if (found_x) theL.push_back(x); else theL.push_back(*it);
   }// for
   return;
 }//FacetComplex::MakeG
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ ALLOCATES();

  CreateTicTacToc( CallMatlab );
  CreateTicTacToc( callSort   );
  int               I, J, K, ii, jj, kk;
  int               IJ, IJK, IJK_1;
  int               DI, DJ, DK, DIJK, DIJK_1;
  int               CDI, CDJ, CDK;
  int               result, fevals = 0;
  int               NVOLS, NVOLS_1, n, s, s_start, s_end, v_init;
  real              *volumes, *V, x, y, *DIST, *order, last_distance;
  int               *VV=NULL, nV, v, vv;
  char              skip;
  triplet           *TS=NULL, *DTS=NULL, T;
  mxArray           *INPUT[2]={NULL,NULL}, *OUTPUT[3]={NULL,NULL,NULL};
  double            *MAXs, LAST_MAX;
  double            thisMINx, thisMINy;
  double            *idxs;
  double            *vols;
  double            *ijk;
  char              callSort;
  mwSize            toVec[2]={1,1};
  char              VERBOSE = 0;
  char              STR[1024];
  
  
  if( nlhs > 1 ){
    mxErrMsgTxt("too much outputs");
  }


  if( mxIsChar( prhs[nrhs-1] ) ){
    mxGetString( prhs[nrhs-1], STR, 100 );
    if( ! myStrcmpi(STR,"verbose") ){ 
      VERBOSE = 1;
    } else {
      mxErrMsgTxt("only 'verbose' option allowed.");
    }
    nrhs = nrhs-1;
  }
  
  
  if( nrhs != 3 ){
    mxErrMsgTxt("sintax error. max_min_multiples_erodes( V , F , volumes )");
  }

  if( mxGetClassID( prhs[1] ) != mxFUNCTION_CLASS ){
    mxErrMsgTxt("F have to be a function_handle.");
  }

  if( myNDims( prhs[0] ) > 3  ){
    mxErrMsgTxt("bigger than 3d arrays is not allowed.");
  }
  
  NVOLS   = myNumel( prhs[2] );
  NVOLS_1 = NVOLS - 1;
  volumes = myGetPr( prhs[2] );
  
  
  I     = mySize( prhs[0] , 0 );
  J     = mySize( prhs[0] , 1 );
  K     = mySize( prhs[0] , 2 );
  IJ    = I*J;
  IJK   = IJ*K;
  

  VV = (int     *) mxMalloc( IJK*sizeof( int     ) );
  TS     = (triplet *) mxMalloc( IJK*sizeof( triplet ) );

  V = myGetPr( prhs[0] );

  v  = 0; 
  nV = 0;
  for( kk = 0 ; kk < K ; kk++ ){ for( jj = 0 ; jj < J ; jj++ ){ for( ii = 0 ; ii < I ; ii++ ){
    x = V[ v ];
    if( x == x ){
      VV[ nV ] = v;
      TS[ v ].isnan = 0;
      TS[ v ].i     = ii;
      TS[ v ].j     = jj;
      TS[ v ].k     = kk;
      nV++;
    } else {
      TS[ v ].isnan = 1;
    }
    v++;
  }}}


  INPUT[0] = prhs[1];
  INPUT[1] = mxCreateNumericMatrix( 1 , 3 , mxDOUBLE_CLASS , mxREAL );
  ijk = (double *) mxGetData( INPUT[1] );
  
  
  ijk[0] = TS[ VV[ nV/2] ].i + 1;
  ijk[1] = TS[ VV[ nV/2] ].j + 1;
  ijk[2] = TS[ VV[ nV/2] ].k + 1;
  


  OUTPUT[2] = mexCallMATLABWithTrap( 2 , OUTPUT , 2 , INPUT , "feval" );
  
  if( OUTPUT[2] == NULL ){
    
    callSort = 0;
    if( mxGetClassID( OUTPUT[0] ) != mxDOUBLE_CLASS ){
      if( INPUT[1]  != NULL ){ mxDestroyArray( INPUT[1] );  INPUT[1]=NULL;  }
      if( OUTPUT[0] != NULL ){ mxDestroyArray( OUTPUT[0] ); OUTPUT[0]=NULL; }
      if( OUTPUT[1] != NULL ){ mxDestroyArray( OUTPUT[1] ); OUTPUT[1]=NULL; }
      if( OUTPUT[2] != NULL ){ mxDestroyArray( OUTPUT[2] ); OUTPUT[2]=NULL; }
      mxErrMsgTxt("F debe retornar un double en el primer output.");
    }
    if( mxGetClassID( OUTPUT[1] ) != mxDOUBLE_CLASS ){
      if( INPUT[1]  != NULL ){ mxDestroyArray( INPUT[1] );  INPUT[1]=NULL;  }
      if( OUTPUT[0] != NULL ){ mxDestroyArray( OUTPUT[0] ); OUTPUT[0]=NULL; }
      if( OUTPUT[1] != NULL ){ mxDestroyArray( OUTPUT[1] ); OUTPUT[1]=NULL; }
      if( OUTPUT[2] != NULL ){ mxDestroyArray( OUTPUT[2] ); OUTPUT[2]=NULL; }
      mxErrMsgTxt("F debe retornar un double en el segundo output.");
    }
    
  } else {

    callSort = 1;
    if( VERBOSE ){
      mexPrintf("sort has to be called\n");
    }
    
    mxDestroyArray( OUTPUT[2] ); OUTPUT[2] = NULL;

    result = mexCallMATLAB( 1 , OUTPUT , 2 , INPUT , "feval" );
    if( result ){ mxErrMsgTxt("error computing la funcion."); }

    if( mxGetClassID( OUTPUT[0] ) != mxDOUBLE_CLASS ){
      if( INPUT[1]  != NULL ){ mxDestroyArray( INPUT[1] );  INPUT[1]=NULL;  }
      if( OUTPUT[0] != NULL ){ mxDestroyArray( OUTPUT[0] ); OUTPUT[0]=NULL; }
      if( OUTPUT[1] != NULL ){ mxDestroyArray( OUTPUT[1] ); OUTPUT[1]=NULL; }
      if( OUTPUT[2] != NULL ){ mxDestroyArray( OUTPUT[2] ); OUTPUT[2]=NULL; }
      mxErrMsgTxt("F debe retornar un double en el primer output.");
    }

  }

  DI   = mySize( OUTPUT[0] , 0 );
  DJ   = mySize( OUTPUT[0] , 1 );
  DK   = mySize( OUTPUT[0] , 2 );
  
  DTS  = (triplet *) mxMalloc( 2*DI*DJ*DK*sizeof( triplet ) );
  

  plhs[0] = mxCreateNumericMatrix( NVOLS , 1 , mxREAL_CLASS , mxREAL );
  MAXs    = (real *) mxGetData( plhs[0] );
  for( n = 0 ; n < NVOLS ; n++ ){
    MAXs[n] = -10000;
  }

  
  LAST_MAX = MAXs[ NVOLS_1 ];
  for( v_init = 0 ; v_init < EVERY ; v_init++ ){
    if( utIsInterruptPending() ){
      if( INPUT[1]  != NULL ){ mxDestroyArray( INPUT[1] );  INPUT[1]=NULL;  }
      if( OUTPUT[0] != NULL ){ mxDestroyArray( OUTPUT[0] ); OUTPUT[0]=NULL; }
      if( OUTPUT[1] != NULL ){ mxDestroyArray( OUTPUT[1] ); OUTPUT[1]=NULL; }
      if( OUTPUT[2] != NULL ){ mxDestroyArray( OUTPUT[2] ); OUTPUT[2]=NULL; }
      mexPrintf("USER INTERRUP!!!\n");
      mxErrMsgTxt("USER INTERRUP!!!");
    }
    if( VERBOSE ){
      mexPrintf("v_init:  %d  (%g)  of  %d\n", v_init , LAST_MAX , EVERY );
    }

    for( v = v_init ; v < nV ; v += EVERY ){
      vv = VV[ v ];
      
      thisMINx =   V[ vv ];
      thisMINy =  -thisMINx;
      if( ( thisMINx < LAST_MAX )  && ( thisMINy < LAST_MAX ) ){
        continue;
      }

      T = TS[ vv ];
      
      ijk[0] = T.i + 1;
      ijk[1] = T.j + 1;
      ijk[2] = T.k + 1;
      

      if( OUTPUT[0] != NULL ){ mxDestroyArray( OUTPUT[0] ); OUTPUT[0]=NULL; }
      if( OUTPUT[1] != NULL ){ mxDestroyArray( OUTPUT[1] ); OUTPUT[1]=NULL; }
      if( OUTPUT[2] != NULL ){ mxDestroyArray( OUTPUT[2] ); OUTPUT[2]=NULL; }

      if( !callSort ){
        tic( CallMatlab );
        result = mexCallMATLAB( 2 , OUTPUT , 2 , INPUT , "feval" ); fevals++;
        tac( CallMatlab );
      } else {
        tic( CallMatlab );
        result = mexCallMATLAB( 1 , OUTPUT , 2 , INPUT , "feval" ); fevals++;
        tac( CallMatlab );
      }
      
      DI   = mySize( OUTPUT[0] , 0 );
      DJ   = mySize( OUTPUT[0] , 1 );
      DK   = mySize( OUTPUT[0] , 2 );

      DIJK    = DI*DJ*DK;

      if( volumes[ NVOLS_1 ] > DIJK ){
      if( INPUT[1]  != NULL ){ mxDestroyArray( INPUT[1] );  INPUT[1]=NULL;  }
      if( OUTPUT[0] != NULL ){ mxDestroyArray( OUTPUT[0] ); OUTPUT[0]=NULL; }
      if( OUTPUT[1] != NULL ){ mxDestroyArray( OUTPUT[1] ); OUTPUT[1]=NULL; }
      if( OUTPUT[2] != NULL ){ mxDestroyArray( OUTPUT[2] ); OUTPUT[2]=NULL; }
        mxErrMsgTxt("el maximo volumen debe ser menor que numel(DIST)");
      }

      DIJK_1  = DIJK - 1;

      DIST  = (double  *) mxGetData( OUTPUT[0] );
      
      DTS  = (triplet *) mxRealloc( DTS , DIJK*sizeof( triplet ) );
      s = 0;
      for( kk = 0 ; kk < DK ; kk++ ){ for( jj = 0 ; jj < DJ ; jj++ ){ for( ii = 0 ; ii < DI ; ii++ ){
        DTS[ s ].i = ii;
        DTS[ s ].j = jj;
        DTS[ s ].k = kk;
        s++;
      }}}


      if( !callSort ){
        order = (double  *) mxGetData( OUTPUT[1] );
      } else {
        toVec[0] = mxGetNumberOfElements( OUTPUT[0] );
        mxSetDimensions( OUTPUT[0] ,  toVec  , 2 );
        
        tic( callSort );
        result = mexCallMATLAB( 2 , OUTPUT+1 , 1 , OUTPUT , "sort" );
        tac( callSort );
      
        order = (double  *) mxGetData( OUTPUT[2] );
      }
      
      CDI = DTS[ (int) ( order[0] - 1 ) ].i;
      CDJ = DTS[ (int) ( order[0] - 1 ) ].j;
      CDK = DTS[ (int) ( order[0] - 1 ) ].k;
      
      
      skip   = 0;

      s = 0;
      for( n = 0 ; n < NVOLS ; n++ ){
        s_end = (int) ( volumes[n] - 1 );
        last_distance = DIST[ (int) order[ s_end ] - 1 ];
        
        while( s_end < DIJK_1 && DIST[ (int) ( order[ s_end + 1 ] - 1 ) ] == last_distance ){
          s_end++;
        }
        s_end++;
        
        for( ; s < s_end ; s++ ){
          vv = (int) ( order[ s ] - 1 );
          
          ii = T.i + DTS[ vv ].i - CDI;  if( ii < 0 || ii > I ){ skip = 1; break; }
          jj = T.j + DTS[ vv ].j - CDJ;  if( jj < 0 || jj > J ){ skip = 1; break; }
          kk = T.k + DTS[ vv ].k - CDK;  if( kk < 0 || kk > K ){ skip = 1; break; }
            
          vv = ii + jj*I + kk*IJ;
          if( TS[ vv ].isnan ){  skip = 1; break; }
          x =  V[ vv ];  if( x < thisMINx ){ thisMINx = x; }
          y = -x;        if( y < thisMINy ){ thisMINy = y; }
          if( ( thisMINx < LAST_MAX )  && ( thisMINy < LAST_MAX ) ){
            skip = 1; break; 
          }
        }
        if( skip ){  break; }
        if( thisMINx > MAXs[n] ){ MAXs[n] = thisMINx; }
        if( thisMINy > MAXs[n] ){ MAXs[n] = thisMINy; }
      }
      LAST_MAX = MAXs[ NVOLS_1 ];

    }
    
  }
  if( INPUT[1]  != NULL ){ mxDestroyArray( INPUT[1]  ); INPUT[1] =NULL; }
  if( OUTPUT[0] != NULL ){ mxDestroyArray( OUTPUT[0] ); OUTPUT[0]=NULL; }
  if( OUTPUT[1] != NULL ){ mxDestroyArray( OUTPUT[1] ); OUTPUT[1]=NULL; }
  if( OUTPUT[2] != NULL ){ mxDestroyArray( OUTPUT[2] ); OUTPUT[2]=NULL; }
  
  if( VERBOSE ){
    mexPrintf( "\nfevals: %d  en  tiempo:   CallMatlab: %20.30g    sorting: %20.30g\n" , fevals , toc( CallMatlab ) , toc( callSort ) );
  }
  
  
  if(  VV != NULL ){  mxFree(  VV ); }
  if(  TS != NULL ){  mxFree(  TS ); }
  if( DTS != NULL ){  mxFree( DTS ); }

  myFreeALLOCATES();

}
Example #4
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {  ALLOCATES();
  
  int     nX, nN;
  
  int     nsd, c, n, x;
  double  *X, *N, *O, *D, *P;
  double  minO, minD, dist, xx;
  double  maximalDIST;
  
  P = NULL;
  
  nsd = mySize( prhs[0] , 1 );
  if( mySize( prhs[1] , 1 ) != nsd ){ myErrMsgTxt("number of spatial coordinates (number of column) have to be the same."); }
  
  
  nX = mySize( prhs[0] , 0 );
  X = myGetPr( prhs[0] );
  
  nN = mySize( prhs[1] , 0 );
  N = myGetPr( prhs[1] );
  
  
  if( nrhs > 2 ){
    maximalDIST = *( myGetPr( prhs[2] ) );
    maximalDIST = maximalDIST*maximalDIST;
//     mexPrintf("minimal %g\n\n",maximalDIST);
  } else {
    maximalDIST = INF;
  }
  
  plhs[0] = mxCreateDoubleMatrix(0,0,mxREAL);
  mxSetM( plhs[0] , nN ); mxSetN( plhs[0] , 1 );  mxSetData( plhs[0] , mxMalloc( nN << 3 ) );
  O = mxGetPr( plhs[0] );
  
  if( nlhs > 1 ){
    plhs[1] = mxCreateDoubleMatrix(0,0,mxREAL);
    mxSetM( plhs[1] , nN ); mxSetN( plhs[1] , 1 );  mxSetData( plhs[1] , mxMalloc( nN << 3 ) );
    D = mxGetPr( plhs[1] );
  }
  
  P = mxMalloc( nsd << 3 );
  
  for( n = 0 ; n < nN ; n++ ){

    for( c = 0 ; c < nsd ; c++ ){ P[c] = N[ c*nN + n ]; }

    dist = 0;
    for( c = 0 ; ( c < nsd ) && ( dist < maximalDIST ); c++ ){
      xx = X[ c*nX + 0 ] - P[c];
      xx = xx*xx;
      dist += xx;
    }
    
    minO = 0;
    minD = dist;
//     for( x = 1 ; x < nX  && ( minD > maximalDIST ); x++ ){
    for( x = 1 ; x < nX  ; x++ ){
      dist = 0;
      for( c = 0 ; c < nsd   &&  ( dist < minD ) && ( dist < maximalDIST ); c++ ){
        xx = X[ c*nX + x ] - P[c];
//         if( fabs(xx) > minD ){ dist = minD + 1e10; break; }
        xx = xx*xx;
        dist += xx;
      }
      
      if( dist < minD ){
        minD = dist;
        minO = x;
      }
    }
    
    O[n] = minO + 1;
    if( nlhs > 1 ){
      D[n] = sqrt( minD );
    }
  }
  

  EXIT:
    if( P != NULL ){ mxFree(P); }
    myFreeALLOCATES();
}
Example #5
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { ALLOCATES();
  real     *X, XX[NN], Xk[NN], XXr[NN], D[N], DS[N], fD[N], V[NN], VS[NN], *O, Ok[NN];
  long     k1, K1, k2, K2, k3, K3, ii, jj;
  int      ORDER[N];
  char     STR[100];

  enum     symmetrize_ { NONE , X_Xt , Xt_X , PLUS };
  enum     symmetrize_ symmetrize;  
  
  enum     outs_types { ID , INVERSE , EIGVALS , EIGVECS , EIGVALSDIAG , MAXDIFF , SQRT , LOG , EXP , evalFUN , DET , TRACE };
  enum     outs_types outs[50];
  int      ndims, Odims[50];
  real     det;
  
  int      oid;
  int      D_computed, V_computed, D_sorted, V_sorted, ORDER_computed;
  int      dim1 , dim2;
  mxArray  *mxX;
  
  if( nlhs == 0 ){ nlhs = 1; }
  if( nlhs > nrhs-2 ){
    myErrMsgTxt("There are no enough inputs.\n");
  }

  if( mxIsCell( prhs[0] ) ){
    mxX = mxGetCell( prhs[0] , 0 );
    dim1 = myGetValue( mxGetCell( prhs[0] , 1 ) );
    dim2 = myGetValue( mxGetCell( prhs[0] , 2 ) );
  } else {
    mxX = prhs[0];
    dim1 = 1;
    dim2 = 2;
  }
  
  if( ( mySize( mxX , dim1-1 ) != N ) || ( mySize( mxX , dim1-1 ) != N ) ){
    myErrMsgTxt("size( X , %d ) and size( X , %d ) have to be equal to three.\n",dim1,dim2);
  }
  

  if( myIsEmpty( prhs[1] ) ){
    symmetrize = NONE;
  } else if( mxIsChar(prhs[1]) ){
    mxGetString( prhs[1], STR, 100 );
    
    if(        !myStrcmpi(STR,"+") ) {
      symmetrize = PLUS;
    } else if( !myStrcmpi(STR,"xt*x") || !myStrcmpi(STR,"xtx") ) {
      symmetrize = Xt_X;
    } else if( !myStrcmpi(STR,"x*xt") || !myStrcmpi(STR,"xxt") ) {
      symmetrize = X_Xt;
    } else {
      myErrMsgTxt("Second argument expected: 'xt*x' , 'x*xt' , '+' , or [].\n");
    }

  } else {
    myErrMsgTxt("Second argument expected: 'xt*x' , 'x*xt' , '+' , or [].\n");
  }
  

  for( oid = 0 ; oid < nlhs ; oid++ ){
    if( ! mxIsChar(prhs[oid+2]) ){
      myErrMsgTxt("Valids arguments are: 'id' 'eigval' 'eigvec' 'log' 'sqrt' 'exp' 'error'.\n");
    }
    mxGetString( prhs[oid+2], STR, 100 );
    
    if(        !myStrcmpi(STR,"id") ) {
      outs[oid] = ID;
    } else if( !myStrcmpi(STR,"inv") || !myStrcmpi(STR,"inverse") ) {
      outs[oid] = INVERSE;
    } else if( !myStrcmpi(STR,"det") ) {
      outs[oid] = DET;
    } else if( !myStrcmpi(STR,"trace") ) {
      outs[oid] = TRACE;
    } else if( !myStrcmpi(STR,"evec") || !myStrcmpi(STR,"v") || !myStrcmpi(STR,"eigenvec") || !myStrcmpi(STR,"eigvec") || !myStrcmpi(STR,"eigenvectors") ) {
      outs[oid] = EIGVECS;
    } else if( !myStrcmpi(STR,"eval") || !myStrcmpi(STR,"d") || !myStrcmpi(STR,"eigenval") || !myStrcmpi(STR,"eigval") || !myStrcmpi(STR,"eigenvalues") ) {
      outs[oid] = EIGVALS;
    } else if( !myStrcmpi(STR,"diag") || !myStrcmpi(STR,"dd") ) {
      outs[oid] = EIGVALSDIAG;
    } else if( !myStrcmpi(STR,"error") ) {
      outs[oid] = MAXDIFF;
    } else if( !myStrcmpi(STR,"sqrt") || !myStrcmpi(STR,"sqrtm") ) {
      outs[oid] = SQRT;
    } else if( !myStrcmpi(STR,"log") || !myStrcmpi(STR,"logm") ) {
      outs[oid] = LOG;
    } else if( !myStrcmpi(STR,"exp") || !myStrcmpi(STR,"expm") ) {
      outs[oid] = EXP;
    } else {
      myErrMsgTxt("Valids arguments are: 'id' 'inv' 'det' 'trace' 'eigval' 'eigvec' 'log' 'sqrt' 'exp' 'error'.\n");
    }
  }
  
  
  X = mxGetPr( mxX );
  ndims = myGetSizes( mxX , Odims );
  
  for( oid = 0 ; oid < nlhs ; oid++ ){
    switch( outs[oid] ){
      case ID:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );
        break;
      case INVERSE:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );
        break;
      case DET:
        Odims[dim1-1] = 1;
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        Odims[dim1-1] = N;
        Odims[dim2-1] = N;
        break;
      case TRACE:
        Odims[dim1-1] = 1;
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        Odims[dim1-1] = N;
        Odims[dim2-1] = N;
        break;
      case EIGVALS:
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );
        Odims[dim2-1] = N;
        break;
      case EIGVECS:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case EIGVALSDIAG:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case MAXDIFF:
        Odims[dim1-1] = 1;
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        Odims[dim1-1] = N;
        Odims[dim2-1] = N;
        break;
      case EXP:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case LOG:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case SQRT:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case evalFUN:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
    }
  }
  
  K1 = 1;
  for( k1 = 0    ; k1 < dim1-1 ; k1++ ){  K1 *= Odims[k1]; }
  K2 = 1;
  for( k2 = dim1 ; k2 < dim2-1 ; k2++ ){  K2 *= Odims[k2]; }
  K3 = 1;
  for( k3 = dim2 ; k3 < ndims  ; k3++ ){  K3 *= Odims[k3]; }


  for( k3 = 0 ; k3 < K3 ; k3++ ){
  for( k2 = 0 ; k2 < K2 ; k2++ ){
  for( k1 = 0 ; k1 < K1 ; k1++ ){
    if( K1 == 1 && K2 == 1 ){
      memcpy( Xk , X + k3*NN , NN*sizeof( real ) );
    } else {
      for( jj = 0 ; jj < N ; jj++ ){ for( ii = 0 ; ii < N ; ii++ ){
        Xk[ ii + N*jj ] = X[  k1 + K1*( ii + N*( k2 + K2*( jj + N*k3 ))) ];
      } }
    }
    
    
    switch( symmetrize ){
      case NONE:
        memcpy( XX , Xk , NN*sizeof( real ) );
        break;

      case X_Xt:
        XX[0] = Xk[0]*Xk[0] + Xk[2]*Xk[2];
        XX[1] = Xk[1]*Xk[0] + Xk[3]*Xk[2];

        XX[2] = Xk[0]*Xk[1] + Xk[2]*Xk[3];
        XX[3] = Xk[1]*Xk[1] + Xk[3]*Xk[3];
        break;

      case Xt_X:
        XX[0] = Xk[0]*Xk[0] + Xk[1]*Xk[1];
        XX[1] = Xk[2]*Xk[0] + Xk[3]*Xk[1];

        XX[2] = Xk[0]*Xk[2] + Xk[1]*Xk[3];
        XX[3] = Xk[2]*Xk[2] + Xk[3]*Xk[3];
        break;

      case PLUS:
        XX[0]         = Xk[0];
        XX[1] = XX[2] = ( Xk[1] + Xk[2] )/2.0;
        XX[3]         = Xk[3];
        break;
    }
    
    D_computed      = 0;
    V_computed      = 0;
    ORDER_computed  = 0;
    D_sorted        = 0;
    V_sorted        = 0;
    
    for( oid = 0 ; oid < nlhs ; oid++ ){
      switch( outs[oid] ){
        case ID:
          memcpy( Ok , XX , NN*sizeof( real ) );
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;
          
          
        case INVERSE:
          det = XX[0]*XX[3] - XX[1]*XX[2];
          det = 1.0/det;
          
          Ok[0] =  XX[3] *det;
          Ok[1] = -XX[1] *det;
          Ok[2] = -XX[2] *det;
          Ok[3] =  XX[0] *det;
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;
          

        case DET:
          Ok[0] = XX[0]*XX[3] - XX[1]*XX[2];
          
          O = mxGetPr( plhs[oid] );
          ToOutput1x1;
          break;

          
        case TRACE:
          Ok[0] =  XX[0] + XX[3];
          
          O = mxGetPr( plhs[oid] );
          ToOutput1x1;
          break;

          
        case EIGVALS:
          if( !D_computed     ){ EigenValues2x2( XX , D );          D_computed = 1;      }
          if( !ORDER_computed ){ GetOrder( D, ORDER );              ORDER_computed = 1;  }
          if( !D_sorted       ){ SortEigenValues( D, ORDER , DS );  D_sorted = 1;        }
          
          memcpy( Ok , DS , N*sizeof( real ) );
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x1;
          break;


        case EIGVALSDIAG:
          if( !D_computed     ){ EigenValues2x2( XX , D );          D_computed = 1;      }
          if( !ORDER_computed ){ GetOrder( D, ORDER );              ORDER_computed = 1;  }
          if( !D_sorted       ){ SortEigenValues( D, ORDER , DS );  D_sorted = 1;        }

          Ok[0] = DS[0];
          Ok[3] = DS[1];
          Ok[1] = Ok[2] = 0;

          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;

          
        case EIGVECS:
          if( !D_computed     ){ EigenValues2x2( XX , D );          D_computed = 1;      }
          if( !V_computed     ){ EigenVectors2x2( XX , D , V);      V_computed = 1;      }
          if( !ORDER_computed ){ GetOrder( D, ORDER );              ORDER_computed = 1;  }
          if( !V_sorted       ){ SortEigenVectors( V, ORDER , VS);  V_sorted = 1;        }

          memcpy( Ok , VS , NN*sizeof( real ) );
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;


//         case MAXDIFF:
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           Ok[0] = V[0]*V[0]*D[0] + V[3]*V[3]*D[1] + V[6]*V[6]*D[2];
//           Ok[1] = V[1]*V[0]*D[0] + V[4]*V[3]*D[1] + V[7]*V[6]*D[2];
//           Ok[2] = V[2]*V[0]*D[0] + V[5]*V[3]*D[1] + V[8]*V[6]*D[2];
// 
//           Ok[3] = V[0]*V[1]*D[0] + V[3]*V[4]*D[1] + V[6]*V[7]*D[2];
//           Ok[4] = V[1]*V[1]*D[0] + V[4]*V[4]*D[1] + V[7]*V[7]*D[2];
//           Ok[5] = V[2]*V[1]*D[0] + V[5]*V[4]*D[1] + V[8]*V[7]*D[2];
// 
//           Ok[6] = V[0]*V[2]*D[0] + V[3]*V[5]*D[1] + V[6]*V[8]*D[2];
//           Ok[7] = V[1]*V[2]*D[0] + V[4]*V[5]*D[1] + V[7]*V[8]*D[2];
//           Ok[8] = V[2]*V[2]*D[0] + V[5]*V[5]*D[1] + V[8]*V[8]*D[2];
// 
//           Ok[0] =  MAX9( fabs( Ok[0] - XX[0] ) ,
//                          fabs( Ok[1] - XX[1] ) ,
//                          fabs( Ok[2] - XX[2] ) ,
//                          fabs( Ok[3] - XX[3] ) ,
//                          fabs( Ok[4] - XX[4] ) ,
//                          fabs( Ok[5] - XX[5] ) ,
//                          fabs( Ok[6] - XX[6] ) ,
//                          fabs( Ok[7] - XX[7] ) ,
//                          fabs( Ok[8] - XX[8] ) );
// 
//           O = mxGetPr( plhs[oid] );
//           ToOutput1x1;
//           break;
// 
//           
//         case SQRT:
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           fD[0] = sqrt( D[0] );
//           fD[1] = sqrt( D[1] );
//           fD[2] = sqrt( D[2] );
//           
//           FillOk;
//           O = mxGetPr( plhs[oid] );
//           ToOutput3x3;
//           break;
// 
//           
//         case LOG:
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           fD[0] = log( D[0] );
//           fD[1] = log( D[1] );
//           fD[2] = log( D[2] );
//           
//           FillOk;
//           O = mxGetPr( plhs[oid] );
//           ToOutput3x3;
//           break;

        #define r       eval[0]
        #define e       eval[1]
        #define er      eval[2]
        case EXP:
          r = XX[0] - XX[3];
          r = 4*XX[1]*XX[2] + r*r;
          
          if( r >= 0 ){
            r = sqrt(r);
            
            
            e = exp( ( XX[0] + XX[3] - r )/2 )/r/2.0;
            er = exp(r);
            
            Ok[0] = e * ( XX[3] - XX[0] + r + er*(XX[0]-XX[3]+r) );
            
            Ok[1] = e * XX[1] * ( er - 1 ) * 2;
            
            Ok[2] = e * XX[2] * ( er - 1 ) * 2;
            
            Ok[3] = e * ( XX[0] - XX[3] + r + er*(XX[3]-XX[0]+r) );

          } else {
            
            r = sqrt( -r );
            
            e = exp( ( XX[0] + XX[3] )/2 )/r;
            er = sin(r/2);
            
            Ok[0] = e * ( r*cos(r/2) + ( XX[0]-XX[3] )*er );
            
            Ok[1] = 2 * XX[1] * e * er;
            
            Ok[2] = 2 * XX[2] * e * er;            
            
            Ok[3] = e * ( r*cos(r/2) + ( XX[3]-XX[0] )*er );
            
          }
          
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;

          
          
//         case evalFUN:
//           O = mxGetPr( plhs[oid] ) + k*NN;
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           fD[0] = exp( D[0] );
//           fD[1] = exp( D[1] );
//           fD[2] = exp( D[2] );
// 
//           mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[], const char *name)
//           
//           FillO
//           break;
      
      }
    }
    
  }}}
  
  EXIT: myFreeALLOCATES();
}
Example #6
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
	ALLOCATES();

	real *M, *O;
	int NX, NY;
	int Odims[2];

	if(nrhs < 1)
		mexErrMsgTxt("no input matrix!!.");
	if(nrhs > 1)
		mexPrintf("only first argument wil be inverted!!.");

	if(mxIsComplex(prhs[0]))
		mexErrMsgTxt("input matrix is a complex data!!.");
	if(mxIsEmpty(prhs[0]))
		mexErrMsgTxt("input matrix is empty!!.");
	if(!mxIsNumeric(prhs[0]))
		mexErrMsgTxt("input matrix is not numeric!!.");

	NX = mySize( prhs[0] , 0 );
	NY = mySize( prhs[0] , 1 );

	if( NX != NY ){ myErrMsgTxt("no square matrix!!."); }
	
	M = (real*)myGetPr( prhs[0] );

	/*Creating output*/
	Odims[0] = NX;
	Odims[1] = NY;
	plhs[0] = mxCreateNumericArray( 2 , Odims , mxDOUBLE_CLASS , mxREAL );
	O = (real*)myGetPr( plhs[0] );
	/*END Creating output*/
	
	switch (NX)
	{
	case 1:
		O[0] = 1/M[0];
		break;
	case 2:
		invt2x2m(O, M);
		break;
	case 3:
		invt3x3m(O, M);
		break;
	case 4:
		if( (M[3] == 0) && (M[7] == 0) && (M[11] == 0) && (M[15] == 1) )
		{
			invt4x4mh(O, M);
		}
		else
		{
			invt4x4m(O, M);
			//myErrMsgTxt("inverting matrix 4 x 4 not homogeneous is not implemented yet.");
		}
			break;
	default:
		myErrMsgTxt("max size matrix for inverting: 4 x 4.");
		break;
	}

	  EXIT: myFreeALLOCATES();
}
Example #7
0
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){

  int             n, i, j ,k, I, J, K, IJ, I1, J1, K1;
  int             i0,i1,j0,j1,k0,k1,slice;
  mwSize          sizes[3];
  mxLogical       *V, *O;
  int             connect;

  if( nrhs < 1 ){
    mxErrMsgTxt("sintax error\n");
  }
  
  if( !mxIsLogical( prhs[0] ) ){
    mxErrMsgTxt("array have to be logical.\n");
  }
  if( myNDims( prhs[0] ) > 3 ){
    mxErrMsgTxt("bigger than 3d arrays is not allowed.\n");
  }
  
  if( nrhs > 1 ){
    connect = myGetValue( prhs[1] );
    if( connect != 26 && connect != 18 && connect != 6 ){
      mxErrMsgTxt("valid connects are 6, 18, 26.\n");
    }
  } else {
    connect = 26;
  }
  

  I  = mySize( prhs[0] , 0 );
  J  = mySize( prhs[0] , 1 );
  K  = mySize( prhs[0] , 2 );
  IJ = I*J;
  I1 = I-1;
  J1 = J-1;
  K1 = K-1;
  
  
  sizes[0] = I;
  sizes[1] = J;
  sizes[2] = K;
  
  V = (mxLogical *) mxGetData( prhs[0] );

  plhs[0] = mxCreateLogicalArray( 3 , sizes );
  O = (mxLogical *) mxGetData( plhs[0] );
  

  if( connect == 26 ){

    n = 0;
    for( k = 0 ; k < K ; k++ ){
      k0 = k > 0  ? k - 1 : k;
      k1 = k < K1 ? k + 1 : k;

      for( j = 0 ; j < J ; j++ ){
        j0 = j > 0  ? j - 1 : j;
        j1 = j < J1 ? j + 1 : j;

        for( i = 0 ; i < I ; i++ ){

          if( V[n] ){
            i0 = i > 0  ? i - 1 : i;
            i1 = i < I1 ? i + 1 : i;

            O( i0 , j0 , k0 ) = 1;
            O( i  , j0 , k0 ) = 1;
            O( i1 , j0 , k0 ) = 1;
            O( i0 , j  , k0 ) = 1;
            O( i  , j  , k0 ) = 1;
            O( i1 , j  , k0 ) = 1;
            O( i0 , j1 , k0 ) = 1;
            O( i  , j1 , k0 ) = 1;
            O( i1 , j1 , k0 ) = 1;

            O( i0 , j0 , k  ) = 1;
            O( i  , j0 , k  ) = 1;
            O( i1 , j0 , k  ) = 1;
            O( i0 , j  , k  ) = 1;
            O[ n            ] = 1;
            O( i1 , j  , k  ) = 1;
            O( i0 , j1 , k  ) = 1;
            O( i  , j1 , k  ) = 1;
            O( i1 , j1 , k  ) = 1;

            O( i0 , j0 , k1 ) = 1;
            O( i  , j0 , k1 ) = 1;
            O( i1 , j0 , k1 ) = 1;
            O( i0 , j  , k1 ) = 1;
            O( i  , j  , k1 ) = 1;
            O( i1 , j  , k1 ) = 1;
            O( i0 , j1 , k1 ) = 1;
            O( i  , j1 , k1 ) = 1;
            O( i1 , j1 , k1 ) = 1;

          }
          n++;
        }
      }
    }

  } else if( connect == 18 ){

    n = 0;
    for( k = 0 ; k < K ; k++ ){
      k0 = k > 0  ? k - 1 : k;
      k1 = k < K1 ? k + 1 : k;

      for( j = 0 ; j < J ; j++ ){
        j0 = j > 0  ? j - 1 : j;
        j1 = j < J1 ? j + 1 : j;

        for( i = 0 ; i < I ; i++ ){

          if( V[n] ){
            i0 = i > 0  ? i - 1 : i;
            i1 = i < I1 ? i + 1 : i;

            O( i  , j0 , k0 ) = 1;
            O( i0 , j  , k0 ) = 1;
            O( i  , j  , k0 ) = 1;
            O( i1 , j  , k0 ) = 1;
            O( i  , j1 , k0 ) = 1;

            O( i0 , j0 , k  ) = 1;
            O( i  , j0 , k  ) = 1;
            O( i1 , j0 , k  ) = 1;
            O( i0 , j  , k  ) = 1;
            O[ n            ] = 1;
            O( i1 , j  , k  ) = 1;
            O( i0 , j1 , k  ) = 1;
            O( i  , j1 , k  ) = 1;
            O( i1 , j1 , k  ) = 1;

            O( i  , j0 , k1 ) = 1;
            O( i0 , j  , k1 ) = 1;
            O( i  , j  , k1 ) = 1;
            O( i1 , j  , k1 ) = 1;
            O( i  , j1 , k1 ) = 1;

          }
          n++;
        }
      }
    }

  } else if( connect == 6 ){

    n = 0;
    for( k = 0 ; k < K ; k++ ){
      k0 = k > 0   ? k - 1 : k;
      k1 = k < K-1 ? k + 1 : k;

      for( j = 0 ; j < J ; j++ ){
        j0 = j > 0   ? j - 1 : j;
        j1 = j < J-1 ? j + 1 : j;

        for( i = 0 ; i < I ; i++ ){

          if( V[n] ){
            i0 = i > 0   ? i - 1 : i;
            i1 = i < I-1 ? i + 1 : i;

            O( i0 , j  , k  ) = 1;
            O( i  , j  , k  ) = 1;
            O( i1 , j  , k  ) = 1;

            O( i  , j0 , k  ) = 1;
            O[ n            ] = 1;
            O( i  , j1 , k  ) = 1;

            O( i  , j  , k0 ) = 1;
            O( i  , j  , k  ) = 1;
            O( i  , j  , k1 ) = 1;

          }
          n++;
        }
      }
    }

  }

  
}