IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 10001


Ignore:
Timestamp:
Nov 14, 2006, 6:09:23 PM (19 years ago)
Author:
magnier
Message:

more dev work on the psSparseBorder concepts

Location:
trunk/psLib/src/math
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/math/psSparse.c

    r9995 r10001  
    229229}
    230230
    231 // allocate a sparse matrix container for Nrows, with Nelem slots allocated
    232 psSparseBorder *psSparseBorderAlloc (int Nrows, int Nelem)
    233 {
    234     psSparseBorder *sparse = (psSparseBorder *)psAlloc(sizeof(psSparseBorder));
    235     psMemSetDeallocator(sparse, (psFreeFunc) psSparseBorderFree);
    236 
    237     sparse->Nrows = Nrows;
    238     sparse->Nelem = Nelem;
    239 
    240     sparse->Bij = psImageAlloc(Nelem, Nrows, PS_DATA_F32);
    241     psInitImage (sparse->Bij, 0.0);
    242 
    243     sparse->Qii = psImageAlloc(Nrows, Nrows, PS_DATA_F32);
    244     psInitImage (sparse->Qii, 0.0);
    245 
    246     return sparse;
    247 }
    248 
    249 // add elements to sparse->Qii
    250 bool psSparseBorderMatrixElement(psSparseBorder *sparse, int i, int j, float value)
    251 {
    252     PS_ASSERT_PTR_NON_NULL(sparse, false);
    253     PS_ASSERT_PTR_NON_NULL(sparse->Qii, false);
     231// allocate a sparse matrix border container for a system with Nrows + Nborder elements
     232// the supplied psSparse has a size of Nrows
     233psSparseBorder *psSparseBorderAlloc(psSparse *sparse, int Nborder)
     234{
     235    psSparseBorder *border = (psSparseBorder *)psAlloc(sizeof(psSparseBorder));
     236    psMemSetDeallocator(border, (psFreeFunc) psSparseBorderFree);
     237
     238    int Nrows = sparse->Nrows;
     239    border->Nrows = Nrows;
     240    border->Nborder = Nborder;
     241
     242    border->Bij = psImageAlloc(Nrows, Nborder, PS_DATA_F32);
     243    psImageInit (border->Bij, 0.0);
     244
     245    border->Qii = psImageAlloc(Nborder, Nborder, PS_DATA_F32);
     246    psImageInit (border->Qii, 0.0);
     247
     248    border->Yi = psVectorAlloc(Nborder, PS_DATA_F32);
     249    psVectorInit (border->Yi, 0.0);
     250
     251    border->Gi = psVectorAlloc(Nborder, PS_DATA_F32);
     252    psVectorInit (border->Gi, 0.0);
     253
     254    return border;
     255}
     256
     257// add elements to border->Qii
     258bool psSparseBorderElementQ(psSparseBorder *border, int i, int j, float value)
     259{
     260    PS_ASSERT_PTR_NON_NULL(border, false);
     261    PS_ASSERT_PTR_NON_NULL(border->Qii, false);
    254262    PS_ASSERT_INT_NONNEGATIVE(i, false);
    255263    PS_ASSERT_INT_NONNEGATIVE(j, false);
    256264
    257     // check i,j against sparse->Qii->nX,nY
    258     sparse->Qii->data.F32[i][j] = value;
    259     return true;
    260 }
    261 
    262 // add elements to sparse->Bij
    263 bool psSparseBorderVectorElement(psSparseBorder *sparse, int i, int j, float value)
    264 {
    265     PS_ASSERT_PTR_NON_NULL(sparse, false);
    266     PS_ASSERT_PTR_NON_NULL(sparse->Qii, false);
     265    // check i,j against border->Qii->nX,nY
     266    border->Qii->data.F32[i][j] = value;
     267    return true;
     268}
     269
     270// add elements to border->Bij
     271bool psSparseBorderElementB(psSparseBorder *border, int i, int j, float value)
     272{
     273    PS_ASSERT_PTR_NON_NULL(border, false);
     274    PS_ASSERT_PTR_NON_NULL(border->Bij, false);
    267275    PS_ASSERT_INT_NONNEGATIVE(i, false);
    268276    PS_ASSERT_INT_NONNEGATIVE(j, false);
    269277
    270     sparse->Bij->data.F32[i][j] = value;
     278    border->Bij->data.F32[i][j] = value;
     279    return true;
     280}
     281
     282// add elements to border->Yi
     283bool psSparseBorderElementY(psSparseBorder *border, int i, float value)
     284{
     285    PS_ASSERT_PTR_NON_NULL(border, false);
     286    PS_ASSERT_PTR_NON_NULL(border->Yi, false);
     287    PS_ASSERT_INT_NONNEGATIVE(i, false);
     288
     289    border->Yi->data.F32[i] = value;
     290    return true;
     291}
     292
     293// add elements to border->Gi
     294bool psSparseBorderElementY(psSparseBorder *border, int i, float value)
     295{
     296    PS_ASSERT_PTR_NON_NULL(border, false);
     297    PS_ASSERT_PTR_NON_NULL(border->Gi, false);
     298    PS_ASSERT_INT_NONNEGATIVE(i, false);
     299
     300    border->Gi->data.F32[i] = value;
     301    return true;
     302}
     303
     304// perform the operation dG = B*x
     305psVector *psSparseBorderUpperProduct (psSparse *border)
     306{
     307
     308    int Nborder = border->Nborder;
     309    int Nrow = border->Nrows;
     310
     311    psVector *dG = psVectorAlloc (Nborder, PS_DATA_F32);
     312    psVectorInit (dG, 0.0);
     313
     314    for (int j = 0; j < Nborder; j++) {
     315        double value = 0;
     316        for (int i = 0; i < Nrows; i++) {
     317            value += border->Bij->data.F32[i][j] * x->data.F32[i];
     318        }
     319        dG->data.F32[j] = value;
     320    }
     321
     322    return dG;
     323}
     324
     325// perform the operation dF = B^T*y
     326psVector *psSparseBorderLowerProduct (psSparse *border)
     327{
     328
     329    int Nborder = border->Nborder;
     330    int Nrow = border->Nrows;
     331
     332    psVector *dF = psVectorAlloc (Nrows, PS_DATA_F32);
     333    psVectorInit (dF, 0.0);
     334
     335    for (int i = 0; i < Nrows; i++) {
     336        double value = 0;
     337        for (int j = 0; j < Nborder; j++) {
     338            value += border->Bij->data.F32[i][j] * border->Yi->data.F32[j];
     339        }
     340        dF->data.F32[i] = value;
     341    }
     342
     343    return dF;
     344}
     345
     346// perform the operation dF = B^T*y
     347psVector *psSparseBorderUpperDelta (psSparse *border, psVector *dF)
     348{
     349
     350    int Nborder = border->Nborder;
     351    int Nrow = border->Nrows;
     352
     353    for (int i = 0; i < Nrows; i++) {
     354        border->sparse->Bfj->data.F32[i] -= dF->data.F32[i];
     355    }
     356
     357    return true;
     358}
     359
     360// perform the operation dF = B^T*y
     361psVector *psSparseBorderLowerDelta (psSparse *border, psVector *dG)
     362{
     363
     364    int Nborder = border->Nborder;
     365    int Nrow = border->Nrows;
     366
     367    for (int i = 0; i < Nborder; i++) {
     368        border->Gi->data.F32[i] -= dG->data.F32[i];
     369    }
     370
    271371    return true;
    272372}
  • trunk/psLib/src/math/psSparse.h

    r9991 r10001  
    7171    typedef struct
    7272    {
    73         psImage *Bij;                      // Aij contains the populated elements of the matrix
    74         psImage *Qii;                      // Bfj contains the elements of the vector Bf
    75         int Nelem;                         // Number of elements (long dimension of Bij, 0-j)
    76         int Nrows;                         // Number of rows (size of Qii)
     73        psSparse *sparse;  // corresponding sparse matrix equation
     74        psImage *Bij;   // Aij contains the populated elements of the matrix
     75        psImage *Qii;   // Bfj contains the elements of the vector Bf
     76        psVector *Yi;   // lower independent var
     77        psVector *Gi;   // lower dependent var
     78        int Nrows;   // Number of rows (long dimension of Bij, 0-j)
     79        int Nborder;   // Number of border elements (size of Qii)
    7780    }
    7881psSparseBorder;
     
    8083
    8184// allocate a sparse matrix structure
    82 psSparse *psSparseBorderAlloc(int Nrows, int Nelem);
     85psSparseBorder *psSparseBorderAlloc(psSparse *sparse, int Nborder);
    8386
    8487// add a new matrix element
Note: See TracChangeset for help on using the changeset viewer.