IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7103


Ignore:
Timestamp:
May 9, 2006, 3:02:55 PM (20 years ago)
Author:
Paul Price
Message:

Reorganising psMatrixGJSolve.

File:
1 edited

Legend:

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

    r7101 r7103  
    2121 *  @author Robert DeSonia, MHPCC
    2222 *
    23  *  @version $Revision: 1.37 $ $Name: not supported by cvs2svn $
    24  *  @date $Date: 2006-05-10 00:48:50 $
     23 *  @version $Revision: 1.38 $ $Name: not supported by cvs2svn $
     24 *  @date $Date: 2006-05-10 01:02:55 $
    2525 *
    2626 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    312312    psVector *b)
    313313{
    314     int *indxc,*indxr,*ipiv;
    315     int icol, irow;
    316     int i, j, k, l, ll;
    317     float big, dum, pivinv;
    318314    psF64 *vector = b->data.F64;
    319315    psF64 **matrix = a->data.F64;
    320 
    321316    int Nx = a->numCols;
    322 
    323     indxc = psAlloc(Nx*sizeof(int));
    324     indxr = psAlloc(Nx*sizeof(int));
    325     ipiv  = psAlloc(Nx*sizeof(int));
    326     for (j = 0; j < Nx; j++) {
    327         ipiv[j] = 0;
    328     }
    329 
    330     irow = icol = 0;
    331     big = fabs(matrix[0][0]);
    332 
    333     for (i = 0; i < Nx; i++) {
    334         big = 0.0;
    335         for (j = 0; j < Nx; j++) {
     317    int *indxc = psAlloc(Nx*sizeof(int));
     318    int *indxr = psAlloc(Nx*sizeof(int));
     319    int *ipiv  = psAlloc(Nx*sizeof(int));
     320    memset(ipiv, 0, Nx*sizeof(int));
     321
     322    int irow = 0;
     323    int icol = 0;
     324
     325    for (int i = 0; i < Nx; i++) {
     326        double big = 0.0;
     327        for (int j = 0; j < Nx; j++) {
    336328            if (!isfinite(matrix[i][j])) {
    337                 psTrace (__func__, 3, "Input matrix contains NaNs: matrix[%d][%d] is %.2f\n", i, j, matrix[i][j]);
     329                psError(PS_ERR_BAD_PARAMETER_VALUE, 3,
     330                        "Input matrix contains non-finite elements: matrix[%d][%d] is %.2f\n",
     331                        i, j, matrix[i][j]);
    338332                goto fescape;
    339333            }
    340334            if (ipiv[j] != 1) {
    341                 for (k = 0; k < Nx; k++) {
     335                for (int k = 0; k < Nx; k++) {
    342336                    if (ipiv[k] == 0) {
    343                         if (fabs (matrix[j][k]) >= big) {
     337                        if (fabs(matrix[j][k]) >= big) {
    344338                            big  = fabs(matrix[j][k]);
    345339                            irow = j;
     
    357351        ipiv[icol]++;
    358352        if (irow != icol) {
    359             for (l = 0; l < Nx; l++) {
     353            for (int l = 0; l < Nx; l++) {
    360354                PS_SWAP(matrix[irow][l], matrix[icol][l]);
    361355            }
     
    368362            goto fescape;
    369363        }
    370         pivinv = 1.0 / matrix[icol][icol];
     364        double pivinv = 1.0 / matrix[icol][icol];
    371365        matrix[icol][icol] = 1.0;
    372         for (l = 0; l < Nx; l++) {
     366        for (int l = 0; l < Nx; l++) {
    373367            matrix[icol][l] *= pivinv;
    374368        }
    375369        vector[icol] *= pivinv;
    376370
    377         for (ll = 0; ll < Nx; ll++) {
     371        for (int ll = 0; ll < Nx; ll++) {
    378372            if (ll != icol) {
    379                 dum = matrix[ll][icol];
     373                double dum = matrix[ll][icol];
    380374                matrix[ll][icol] = 0.0;
    381                 for (l = 0; l < Nx; l++) {
     375                for (int l = 0; l < Nx; l++) {
    382376                    matrix[ll][l] -= matrix[icol][l]*dum;
    383377                }
     
    387381    }
    388382
    389     for (l = Nx - 1; l >= 0; l--) {
     383    for (int l = Nx - 1; l >= 0; l--) {
    390384        if (indxr[l] != indxc[l]) {
    391             for (k = 0; k < Nx; k++) {
     385            for (int k = 0; k < Nx; k++) {
    392386                PS_SWAP(matrix[k][indxr[l]], matrix[k][indxc[l]]);
    393387            }
Note: See TracChangeset for help on using the changeset viewer.