IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 2676


Ignore:
Timestamp:
Dec 9, 2004, 11:30:43 AM (22 years ago)
Author:
evanalst
Message:

Fix functionality of psVectorSortIndex when input has multiple entries
with the same value.

Location:
trunk/psLib/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/collections/psVector.c

    r2339 r2676  
    1010*  @author Robert DeSonia, MHPCC
    1111*
    12 *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2004-11-11 20:13:57 $
     12*  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2004-12-09 21:30:43 $
    1414*
    1515*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    306306    psS32 N = 0;
    307307    psVector* tmpVector = NULL;
     308    psVector* checkVector = NULL;
    308309    psElemType inType = 0;
    309310    psU32* outVec;
     
    316317    }
    317318
     319    inType = inVector->type.type;
    318320    N = inVector->n;
    319321
     
    337339
    338340    tmpVector = psVectorSort(tmpVector, inVector);
     341
     342    checkVector = psVectorAlloc(N,PS_TYPE_U8);
     343    for(psS32 k=0; k<N; k++) {
     344        checkVector->data.U8[k] = 0;
     345    }
    339346
    340347    #define SORT_INDICES(TYPE,absfcn,maxError) {                              \
     
    344351        for(psS32 i=0; i<N; i++) {                                              \
    345352            for(psS32 j=0; j<N; j++) {                                          \
    346                 diff = absfcn(tmpVec[i] - inVec[j]);                          \
    347                 if(diff < maxError) {                                         \
    348                     outVec[i] = j;                                            \
    349                     break;                                                    \
    350                 }                                                             \
     353                if(checkVector->data.U8[j] == 0 ) {                                    \
     354                    diff = absfcn(tmpVec[i] - inVec[j]);                          \
     355                    if(diff < maxError) {                                         \
     356                        outVec[i] = j;                                            \
     357                        checkVector->data.U8[j] = 1; \
     358                        break;                                                    \
     359                    }                                                             \
     360                } \
    351361            }                                                                 \
    352362        }                                                                     \
     
    356366    switch (inType) {
    357367    case PS_TYPE_U8:
    358         SORT_INDICES(U8,/* no absfcn needed */,1);
     368        SORT_INDICES(U8,abs,1);
    359369        break;
    360370    case PS_TYPE_U16:
    361         SORT_INDICES(U16,/* no absfcn needed */,1);
     371        SORT_INDICES(U16,abs,1);
    362372        break;
    363373    case PS_TYPE_U32:
    364         SORT_INDICES(U32,/* no absfcn needed */,1);
     374        SORT_INDICES(U32,abs,1);
    365375        break;
    366376    case PS_TYPE_U64:
    367         SORT_INDICES(U64,/* no absfcn needed */,1);
     377        SORT_INDICES(U64,abs,1);
    368378        break;
    369379    case PS_TYPE_S8:
    370         SORT_INDICES(S8,/* no absfcn needed */,1);
     380        SORT_INDICES(S8,abs,1);
    371381        break;
    372382    case PS_TYPE_S16:
    373         SORT_INDICES(S16,/* no absfcn needed */,1);
     383        SORT_INDICES(S16,abs,1);
    374384        break;
    375385    case PS_TYPE_S32:
    376         SORT_INDICES(S32,/* no absfcn needed */,1);
     386        SORT_INDICES(S32,abs,1);
    377387        break;
    378388    case PS_TYPE_S64:
    379         SORT_INDICES(S64,/* no absfcn needed */,1);
     389        SORT_INDICES(S64,abs,1);
    380390        break;
    381391    case PS_TYPE_F32:
     
    384394    case PS_TYPE_F64:
    385395        SORT_INDICES(F64,fabs,DBL_EPSILON);
    386         break;
    387     case PS_TYPE_C32:
    388         SORT_INDICES(F64,cabsf,FLT_EPSILON);
    389         break;
    390     case PS_TYPE_C64:
    391         SORT_INDICES(F64,cabs,DBL_EPSILON);
    392396        break;
    393397    default:
     
    399403    // Free temp memory
    400404    psFree(tmpVector);
     405    psFree(checkVector);
    401406
    402407    return outVector;
  • trunk/psLib/src/mathtypes/psVector.c

    r2339 r2676  
    1010*  @author Robert DeSonia, MHPCC
    1111*
    12 *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2004-11-11 20:13:57 $
     12*  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2004-12-09 21:30:43 $
    1414*
    1515*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    306306    psS32 N = 0;
    307307    psVector* tmpVector = NULL;
     308    psVector* checkVector = NULL;
    308309    psElemType inType = 0;
    309310    psU32* outVec;
     
    316317    }
    317318
     319    inType = inVector->type.type;
    318320    N = inVector->n;
    319321
     
    337339
    338340    tmpVector = psVectorSort(tmpVector, inVector);
     341
     342    checkVector = psVectorAlloc(N,PS_TYPE_U8);
     343    for(psS32 k=0; k<N; k++) {
     344        checkVector->data.U8[k] = 0;
     345    }
    339346
    340347    #define SORT_INDICES(TYPE,absfcn,maxError) {                              \
     
    344351        for(psS32 i=0; i<N; i++) {                                              \
    345352            for(psS32 j=0; j<N; j++) {                                          \
    346                 diff = absfcn(tmpVec[i] - inVec[j]);                          \
    347                 if(diff < maxError) {                                         \
    348                     outVec[i] = j;                                            \
    349                     break;                                                    \
    350                 }                                                             \
     353                if(checkVector->data.U8[j] == 0 ) {                                    \
     354                    diff = absfcn(tmpVec[i] - inVec[j]);                          \
     355                    if(diff < maxError) {                                         \
     356                        outVec[i] = j;                                            \
     357                        checkVector->data.U8[j] = 1; \
     358                        break;                                                    \
     359                    }                                                             \
     360                } \
    351361            }                                                                 \
    352362        }                                                                     \
     
    356366    switch (inType) {
    357367    case PS_TYPE_U8:
    358         SORT_INDICES(U8,/* no absfcn needed */,1);
     368        SORT_INDICES(U8,abs,1);
    359369        break;
    360370    case PS_TYPE_U16:
    361         SORT_INDICES(U16,/* no absfcn needed */,1);
     371        SORT_INDICES(U16,abs,1);
    362372        break;
    363373    case PS_TYPE_U32:
    364         SORT_INDICES(U32,/* no absfcn needed */,1);
     374        SORT_INDICES(U32,abs,1);
    365375        break;
    366376    case PS_TYPE_U64:
    367         SORT_INDICES(U64,/* no absfcn needed */,1);
     377        SORT_INDICES(U64,abs,1);
    368378        break;
    369379    case PS_TYPE_S8:
    370         SORT_INDICES(S8,/* no absfcn needed */,1);
     380        SORT_INDICES(S8,abs,1);
    371381        break;
    372382    case PS_TYPE_S16:
    373         SORT_INDICES(S16,/* no absfcn needed */,1);
     383        SORT_INDICES(S16,abs,1);
    374384        break;
    375385    case PS_TYPE_S32:
    376         SORT_INDICES(S32,/* no absfcn needed */,1);
     386        SORT_INDICES(S32,abs,1);
    377387        break;
    378388    case PS_TYPE_S64:
    379         SORT_INDICES(S64,/* no absfcn needed */,1);
     389        SORT_INDICES(S64,abs,1);
    380390        break;
    381391    case PS_TYPE_F32:
     
    384394    case PS_TYPE_F64:
    385395        SORT_INDICES(F64,fabs,DBL_EPSILON);
    386         break;
    387     case PS_TYPE_C32:
    388         SORT_INDICES(F64,cabsf,FLT_EPSILON);
    389         break;
    390     case PS_TYPE_C64:
    391         SORT_INDICES(F64,cabs,DBL_EPSILON);
    392396        break;
    393397    default:
     
    399403    // Free temp memory
    400404    psFree(tmpVector);
     405    psFree(checkVector);
    401406
    402407    return outVector;
Note: See TracChangeset for help on using the changeset viewer.