Changeset 15254 for trunk/psLib/src/math/psMinimizePolyFit.c
- Timestamp:
- Oct 9, 2007, 9:27:04 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psMinimizePolyFit.c (modified) (27 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMinimizePolyFit.c
r13396 r15254 10 10 * @author EAM, IfA 11 11 * 12 * @version $Revision: 1.3 1$ $Name: not supported by cvs2svn $13 * @date $Date: 2007- 05-16 16:16:48$12 * @version $Revision: 1.32 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2007-10-09 19:25:45 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 340 340 psImage *sums = psImageAlloc(numData, numTerms, PS_TYPE_F64); 341 341 for (int i = 0; i < numTerms; i++) { 342 if (myPoly-> mask[i]) {342 if (myPoly->coeffMask[i] & PS_POLY_MASK_BOTH) { 343 343 continue; 344 344 } … … 358 358 dataMask = mask->data.U8; 359 359 } 360 psU8 * termMask = myPoly->mask; // Mask for polynomial terms360 psU8 *coeffMask = myPoly->coeffMask; // Mask for polynomial terms 361 361 psF64 *yData = y->data.F64; // Coordinate data 362 362 psF64 *yErrData = NULL; // Errors in the coordinate … … 380 380 381 381 for (int i = 0; i < numTerms; i++) { 382 if ( termMask[i]) {382 if (coeffMask[i] & PS_POLY_MASK_BOTH) { 383 383 matrix[i][i] = 1.0; 384 384 continue; … … 387 387 matrix[i][i] += sumsData[i][k] * sumsData[i][k] * wt; // The diagonal entry 388 388 for (int j = i + 1; j < numTerms; j++) { // The upper diagonal only: we will use symmetry 389 if ( termMask[j]) {389 if (coeffMask[j] & PS_POLY_MASK_BOTH) { 390 390 continue; 391 391 } … … 533 533 dataMask = mask->data.U8; 534 534 } 535 psU8 * termMask = myPoly->mask; // Dereferenced version of mask for polynomial terms535 psU8 *coeffMask = myPoly->coeffMask; // Dereferenced version of mask for polynomial terms 536 536 psF64 *ordinates = NULL; // Dereferenced version of ordinate data 537 537 if (x) { … … 567 567 568 568 for (int i = 0; i < nTerm; i++) { 569 if ( termMask[i]) {569 if (coeffMask[i] & PS_POLY_MASK_SET) { 570 570 matrix[i][i] = 1.0; 571 571 continue; … … 574 574 matrix[i][i] += sums[2 * i] * wt; // The diagonal entry 575 575 for (int j = i + 1; j < nTerm; j++) { // The upper diagonal only: we will use symmetry 576 if ( termMask[j]) {576 if (coeffMask[j] & PS_POLY_MASK_SET) { 577 577 continue; 578 578 } … … 584 584 } 585 585 psFree(xSums); 586 587 // elements which are masked for fitting need to be subtracted from the vector 588 for (int i = 0; i < nTerm; i++) { 589 if (coeffMask[i] & PS_POLY_MASK_BOTH) { 590 continue; 591 } 592 for (int j = 0; j < nTerm; j++) { // The upper diagonal only: we will use symmetry 593 if (coeffMask[j] & PS_POLY_MASK_SET) { 594 continue; 595 } 596 if (!(coeffMask[j] & PS_POLY_MASK_FIT)) { 597 continue; 598 } 599 vector[i] -= matrix[i][j]*myPoly->coeff[j]; 600 } 601 } 602 603 // set the un-fitted and un-set elements to 0 or 1 for pivots 604 for (int i = 0; i < nTerm; i++) { 605 if (coeffMask[i] & PS_POLY_MASK_BOTH) { 606 for (int j = 0; j < nTerm; j++) { // The upper diagonal only: we will use symmetry 607 matrix[i][j] = 0.0; 608 matrix[j][i] = 0.0; 609 } 610 matrix[i][i] = 1.0; 611 continue; 612 } 613 } 586 614 587 615 if (psTraceGetLevel("psLib.math") >= 4) { … … 610 638 // polynomial coefficients. this is only true for the 1D case 611 639 for (psS32 k = 0; k < nTerm; k++) { 612 myPoly->coeff[k] = B->data.F64[k];613 myPoly->coeffErr[k] = sqrt(A->data.F64[k][k]);614 } 615 }616 640 if (coeffMask[k] & PS_POLY_MASK_FIT) continue; 641 myPoly->coeff[k] = B->data.F64[k]; 642 myPoly->coeffErr[k] = sqrt(A->data.F64[k][k]); 643 } 644 } 617 645 } else { 618 646 // LUD version of the fit … … 633 661 } else { 634 662 for (psS32 k = 0; k < nTerm; k++) { 663 if (coeffMask[k] & PS_POLY_MASK_FIT) continue; 635 664 myPoly->coeff[k] = coeffs->data.F64[k]; 636 665 // XXX LUD does not give inverse of A … … 990 1019 psFree(A); 991 1020 psFree(B); 992 psTrace("psLib.math", 4, "---- %s() End ----\n", __func__);1021 psTrace("psLib.math", 6, "---- %s() End ----\n", __func__); 993 1022 return false; 994 1023 } … … 997 1026 psF64 **matrix = A->data.F64; // Dereference the least-squares matrix 998 1027 psF64 *vector = B->data.F64; // Dereference the least-squares vector 999 psU8 ** termMask = myPoly->mask; // Dereference mask for polynomial terms1028 psU8 **coeffMask = myPoly->coeffMask; // Dereference mask for polynomial terms 1000 1029 psU8 *dataMask = NULL; // Dereference mask for data 1001 1030 if (mask) { … … 1031 1060 int l = i / nYterm; // x index 1032 1061 int m = i % nYterm; // y index 1033 if ( termMask[l][m]) {1062 if (coeffMask[l][m] & PS_POLY_MASK_SET) { 1034 1063 matrix[i][i] = 1.0; 1035 1064 continue; … … 1040 1069 int p = j / nYterm; // x index 1041 1070 int q = j % nYterm; // y index 1042 if ( termMask[p][q]) {1071 if (coeffMask[p][q] & PS_POLY_MASK_SET) { 1043 1072 continue; 1044 1073 } … … 1050 1079 } 1051 1080 psFree(xySums); 1081 1082 // elements which are masked for fitting need to be subtracted from the vector 1083 for (int i = 0; i < nTerm; i++) { 1084 int ix = i / nYterm; // x index 1085 int iy = i % nYterm; // y index 1086 if (coeffMask[ix][iy] & PS_POLY_MASK_BOTH) { 1087 continue; 1088 } 1089 for (int j = 0; j < nTerm; j++) { // The upper diagonal only: we will use symmetry 1090 int jx = j / nYterm; // x index 1091 int jy = j % nYterm; // y index 1092 if (coeffMask[jx][jy] & PS_POLY_MASK_SET) { 1093 continue; 1094 } 1095 if (!(coeffMask[jx][jy] & PS_POLY_MASK_FIT)) { 1096 continue; 1097 } 1098 vector[i] -= matrix[i][j]*myPoly->coeff[jx][jy]; 1099 } 1100 } 1101 1102 // set the un-fitted and un-set elements to 0 or 1 for pivots 1103 for (int i = 0; i < nTerm; i++) { 1104 int ix = i / nYterm; // x index 1105 int iy = i % nYterm; // y index 1106 if (coeffMask[ix][iy] & PS_POLY_MASK_BOTH) { 1107 for (int j = 0; j < nTerm; j++) { // The upper diagonal only: we will use symmetry 1108 matrix[i][j] = 0.0; 1109 matrix[j][i] = 0.0; 1110 } 1111 matrix[i][i] = 1.0; 1112 continue; 1113 } 1114 } 1115 1116 if (psTraceGetLevel("psLib.math") >= 4) { 1117 printf("Least-squares vector:\n"); 1118 for (int i = 0; i < nTerm; i++) { 1119 printf("%f ", B->data.F64[i]); 1120 } 1121 printf("\n"); 1122 printf("Least-squares matrix:\n"); 1123 for (int i = 0; i < nTerm; i++) { 1124 for (int j = 0; j < nTerm; j++) { 1125 printf("%f ", A->data.F64[i][j]); 1126 } 1127 printf("\n"); 1128 } 1129 } 1052 1130 1053 1131 if (!psMatrixGJSolve(A, B)) { … … 1062 1140 int l = i / nYterm; // x index 1063 1141 int m = i % nYterm; // y index 1064 myPoly->coeff[l][m] = B->data.F64[i]; 1065 myPoly->coeffErr[l][m] = sqrt(A->data.F64[i][i]); 1142 1143 // retain the incoming values if masked on the fit 1144 if (coeffMask[l][m] & PS_POLY_MASK_FIT) continue; 1145 myPoly->coeff[l][m] = B->data.F64[i]; 1146 myPoly->coeffErr[l][m] = sqrt(A->data.F64[i][i]); 1066 1147 } 1067 1148 psFree(A); 1068 1149 psFree(B); 1069 1150 1070 psTrace("psLib.math", 4, "---- %s() end ----\n", __func__);1151 psTrace("psLib.math", 6, "---- %s() end ----\n", __func__); 1071 1152 return true; 1072 1153 } … … 1387 1468 dataMask = mask->data.U8; 1388 1469 } 1389 psU8 *** termMask = myPoly->mask; // Mask for polynomial terms1470 psU8 ***coeffMask = myPoly->coeffMask; // Mask for polynomial terms 1390 1471 int nYZterm = nYterm * nZterm; // Multiplication of the numbers, to calculate the index 1391 1472 … … 1411 1492 int iy = (i % nYZterm) / nZterm; // y index 1412 1493 int iz = (i % nYZterm) % nZterm; // z index 1413 if ( termMask[ix][iy][iz]) {1494 if (coeffMask[ix][iy][iz] & PS_POLY_MASK_BOTH) { 1414 1495 matrix[i][i] = 1.0; 1415 1496 continue; … … 1422 1503 int jy = (j % nYZterm) / nZterm; // y index 1423 1504 int jz = (j % nYZterm) % nZterm; // z index 1424 if ( termMask[jx][jy][jz]) {1505 if (coeffMask[jx][jy][jz] & PS_POLY_MASK_BOTH) { 1425 1506 continue; 1426 1507 } … … 1455 1536 int iy = (i % nYZterm) / nZterm; // y index 1456 1537 int iz = (i % nYZterm) % nZterm; // z index 1538 if (coeffMask[ix][iy][iz] & PS_POLY_MASK_FIT) continue; 1457 1539 myPoly->coeff[ix][iy][iz] = B->data.F64[i]; 1458 1540 myPoly->coeffErr[ix][iy][iz] = sqrt(A->data.F64[i][i]); … … 1480 1562 for (psS32 iz = 0; iz < nZterm; iz++) { 1481 1563 psS32 nx = ix+iy*nXterm+iz*nXterm*nYterm; 1564 if (coeffMask[ix][iy][iz] & PS_POLY_MASK_FIT) continue; 1482 1565 myPoly->coeff[ix][iy][iz] = coeffs->data.F64[nx]; 1483 1566 // XXX myPoly->coeffErr[ix][iy][iz] = sqrt(A->data.F64[nx][nx]); … … 1839 1922 dataMask = mask->data.U8; 1840 1923 } 1841 psU8 **** termMask = myPoly->mask; // Mask for polynomial terms1924 psU8 ****coeffMask = myPoly->coeffMask; // Mask for polynomial terms 1842 1925 int nYZTterm = nYterm * nZterm * nTterm; // Multiplication of the numbers, for calculating the index 1843 1926 int nZTterm = nZterm * nTterm; // Multiplication of the numbers, for calculating the index … … 1865 1948 int iz = ((i % (nYZTterm)) % (nZTterm)) / nTterm; // z index 1866 1949 int it = ((i % (nYZTterm)) % (nZTterm)) % nTterm; // t index 1867 if ( termMask[ix][iy][iz][it]) {1950 if (coeffMask[ix][iy][iz][it] & PS_POLY_MASK_BOTH) { 1868 1951 matrix[i][i] = 1.0; 1869 1952 continue; … … 1877 1960 int jz = ((j % nYZTterm) % nZTterm) / nTterm; // z index 1878 1961 int jt = ((j % nYZTterm) % nZTterm) % nTterm; // t index 1879 if ( termMask[jx][jy][jz][jt]) {1962 if (coeffMask[jx][jy][jz][jt] & PS_POLY_MASK_BOTH) { 1880 1963 continue; 1881 1964 } … … 1918 2001 int iz = ((i % nYZTterm) % nZTterm) / nTterm; // z index 1919 2002 int it = ((i % nYZTterm) % nZTterm) % nTterm; // t index 2003 if (coeffMask[ix][iy][iz][it] & PS_POLY_MASK_FIT) continue; 1920 2004 myPoly->coeff[ix][iy][iz][it] = B->data.F64[i]; 1921 2005 myPoly->coeffErr[ix][iy][iz][it] = sqrt(A->data.F64[i][i]); … … 1944 2028 for (psS32 it = 0; it < nTterm; it++) { 1945 2029 psS32 nx = ix+iy*nXterm+iz*nXterm*nYterm+it*nXterm*nYterm*nZterm; 2030 if (coeffMask[ix][iy][iz][it] & PS_POLY_MASK_FIT) continue; 1946 2031 myPoly->coeff[ix][iy][iz][it] = coeffs->data.F64[nx]; 1947 2032 // myPoly->coeffErr[ix][iy][iz][it] = sqrt(A->data.F64[nx][nx]);
Note:
See TracChangeset
for help on using the changeset viewer.
