Changeset 26702
- Timestamp:
- Jan 27, 2010, 10:06:50 PM (16 years ago)
- Location:
- branches/eam_branches/20091201/psModules/src/imcombine
- Files:
-
- 2 edited
-
pmSubtractionEquation.c (modified) (9 diffs)
-
pmSubtractionMatch.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionEquation.c
r26667 r26702 156 156 if (mode & PM_SUBTRACTION_EQUATION_KERNELS) { 157 157 vector->data.F64[iIndex] = sumIC * poly[iTerm]; 158 // XXX TEST for Hermitians: do not calculate A - norm*B - \sum(k x B), 159 // instead, calculate A - \sum(k x B), with full hermitians 160 if (0 && !(mode & PM_SUBTRACTION_EQUATION_NORM)) { 158 if (!(mode & PM_SUBTRACTION_EQUATION_NORM)) { 161 159 // subtract norm * sumRC * poly[iTerm] 162 160 psAssert (kernels->solution1, "programming error: define solution first!"); … … 232 230 const pmSubtractionKernels *kernels, // Kernels 233 231 const psImage *polyValues, // Spatial polynomial values 234 int footprint // (Half-)Size of stamp 232 int footprint, // (Half-)Size of stamp 233 const pmSubtractionEquationCalculationMode mode 235 234 ) 236 235 { … … 272 271 } 273 272 273 274 // initialize the matrix and vector for NOP on all coeffs. we only fill in the coeffs we 275 // choose to calculate 276 psImageInit(matrix, 0.0); 277 psVectorInit(vector, 1.0); 278 for (int i = 0; i < matrix->numCols; i++) { 279 matrix->data.F64[i][i] = 1.0; 280 } 274 281 275 282 for (int i = 0; i < numKernels; i++) { … … 306 313 } 307 314 308 // Spatial variation 309 for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) { 310 for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) { 311 double aa = sumAA * poly2[iTerm][jTerm]; 312 double bb = sumBB * poly2[iTerm][jTerm]; 313 double ab = sumAB * poly2[iTerm][jTerm]; 314 315 matrix->data.F64[iIndex][jIndex] = aa; 316 matrix->data.F64[jIndex][iIndex] = aa; 317 318 matrix->data.F64[iIndex + numParams][jIndex + numParams] = bb; 319 matrix->data.F64[jIndex + numParams][iIndex + numParams] = bb; 320 321 matrix->data.F64[iIndex][jIndex + numParams] = ab; 322 matrix->data.F64[jIndex + numParams][iIndex] = ab; 323 } 324 } 315 // Spatial variation of kernel coeffs 316 if (mode & PM_SUBTRACTION_EQUATION_KERNELS) { 317 for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) { 318 for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) { 319 double aa = sumAA * poly2[iTerm][jTerm]; 320 double bb = sumBB * poly2[iTerm][jTerm]; 321 double ab = sumAB * poly2[iTerm][jTerm]; 322 323 matrix->data.F64[iIndex][jIndex] = aa; 324 matrix->data.F64[jIndex][iIndex] = aa; 325 326 matrix->data.F64[iIndex + numParams][jIndex + numParams] = bb; 327 matrix->data.F64[jIndex + numParams][iIndex + numParams] = bb; 328 329 matrix->data.F64[iIndex][jIndex + numParams] = ab; 330 matrix->data.F64[jIndex + numParams][iIndex] = ab; 331 } 332 } 333 } 325 334 } 326 335 for (int j = 0; j < i; j++) { … … 340 349 } 341 350 342 // Spatial variation 343 for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) { 344 for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) { 345 double ab = sumAB * poly2[iTerm][jTerm]; 346 matrix->data.F64[iIndex][jIndex + numParams] = ab; 347 matrix->data.F64[jIndex + numParams][iIndex] = ab; 348 } 349 } 351 // Spatial variation of kernel coeffs 352 if (mode & PM_SUBTRACTION_EQUATION_KERNELS) { 353 for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) { 354 for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) { 355 double ab = sumAB * poly2[iTerm][jTerm]; 356 matrix->data.F64[iIndex][jIndex + numParams] = ab; 357 matrix->data.F64[jIndex + numParams][iIndex] = ab; 358 } 359 } 360 } 350 361 } 351 362 … … 403 414 double bi2 = sumBI2 * poly[iTerm]; 404 415 double ai1 = sumAI1 * poly[iTerm]; 405 double a = sumA * poly[iTerm];416 double a = sumA * poly[iTerm]; 406 417 double bi1 = sumBI1 * poly[iTerm]; 407 double b = sumB * poly[iTerm]; 408 409 matrix->data.F64[iIndex][normIndex] = ai1; 410 matrix->data.F64[normIndex][iIndex] = ai1; 411 matrix->data.F64[iIndex][bgIndex] = a; 412 matrix->data.F64[bgIndex][iIndex] = a; 413 matrix->data.F64[iIndex + numParams][normIndex] = bi1; 414 matrix->data.F64[normIndex][iIndex + numParams] = bi1; 415 matrix->data.F64[iIndex + numParams][bgIndex] = b; 416 matrix->data.F64[bgIndex][iIndex + numParams] = b; 417 vector->data.F64[iIndex] = ai2; 418 vector->data.F64[iIndex + numParams] = bi2; 418 double b = sumB * poly[iTerm]; 419 420 if ((mode & PM_SUBTRACTION_EQUATION_NORM) && (mode & PM_SUBTRACTION_EQUATION_KERNELS)) { 421 matrix->data.F64[iIndex][normIndex] = ai1; 422 matrix->data.F64[normIndex][iIndex] = ai1; 423 matrix->data.F64[iIndex + numParams][normIndex] = bi1; 424 matrix->data.F64[normIndex][iIndex + numParams] = bi1; 425 } 426 if ((mode & PM_SUBTRACTION_EQUATION_BG) && (mode & PM_SUBTRACTION_EQUATION_KERNELS)) { 427 matrix->data.F64[iIndex][bgIndex] = a; 428 matrix->data.F64[bgIndex][iIndex] = a; 429 matrix->data.F64[iIndex + numParams][bgIndex] = b; 430 matrix->data.F64[bgIndex][iIndex + numParams] = b; 431 } 432 if (mode & PM_SUBTRACTION_EQUATION_KERNELS) { 433 vector->data.F64[iIndex] = ai2; 434 vector->data.F64[iIndex + numParams] = bi2; 435 if (!(mode & PM_SUBTRACTION_EQUATION_NORM)) { 436 // subtract norm * sumRC * poly[iTerm] 437 psAssert (kernels->solution1, "programming error: define solution first!"); 438 int normIndex = PM_SUBTRACTION_INDEX_NORM(kernels); // Index for normalisation 439 double norm = fabs(kernels->solution1->data.F64[normIndex]); // Normalisation 440 vector->data.F64[iIndex] -= norm * ai1; 441 vector->data.F64[iIndex + numParams] -= norm * bi1; 442 } 443 } 419 444 } 420 445 } … … 457 482 } 458 483 } 459 matrix->data.F64[bgIndex][normIndex] = sumI1; 460 matrix->data.F64[normIndex][bgIndex] = sumI1; 461 matrix->data.F64[normIndex][normIndex] = sumI1I1; 462 matrix->data.F64[bgIndex][bgIndex] = sum1; 463 vector->data.F64[bgIndex] = sumI2; 464 vector->data.F64[normIndex] = sumI1I2; 465 484 if (mode & PM_SUBTRACTION_EQUATION_NORM) { 485 matrix->data.F64[normIndex][normIndex] = sumI1I1; 486 vector->data.F64[normIndex] = sumI1I2; 487 } 488 if (mode & PM_SUBTRACTION_EQUATION_BG) { 489 matrix->data.F64[bgIndex][bgIndex] = sum1; 490 vector->data.F64[bgIndex] = sumI2; 491 } 492 if ((mode & PM_SUBTRACTION_EQUATION_NORM) && (mode & PM_SUBTRACTION_EQUATION_BG)) { 493 matrix->data.F64[bgIndex][normIndex] = sumI1; 494 matrix->data.F64[normIndex][bgIndex] = sumI1; 495 } 466 496 return true; 467 497 } … … 680 710 status = calculateDualMatrixVector(stamp->matrix, stamp->vector,stamp->image1, stamp->image2, 681 711 weight, window, stamp->convolutions1, stamp->convolutions2, 682 kernels, polyValues, footprint );712 kernels, polyValues, footprint, mode); 683 713 break; 684 714 default: … … 1298 1328 if (!kernels->solution1) { 1299 1329 kernels->solution1 = psVectorAlloc(numSolution1, PS_TYPE_F64); 1330 psVectorInit (kernels->solution1, 0.0); 1300 1331 } 1301 1332 if (!kernels->solution2) { 1302 1333 kernels->solution2 = psVectorAlloc(numSolution2, PS_TYPE_F64); 1303 } 1334 psVectorInit (kernels->solution2, 0.0); 1335 } 1336 1337 // only update the solutions that we chose to calculate: 1338 if (mode & PM_SUBTRACTION_EQUATION_NORM) { 1339 int normIndex = PM_SUBTRACTION_INDEX_NORM(kernels); // Index for normalisation 1340 kernels->solution1->data.F64[normIndex] = solution->data.F64[normIndex]; 1341 } 1342 if (mode & PM_SUBTRACTION_EQUATION_BG) { 1343 int bgIndex = PM_SUBTRACTION_INDEX_BG(kernels); // Index in matrix for background 1344 kernels->solution1->data.F64[bgIndex] = solution->data.F64[bgIndex]; 1345 } 1346 if (mode & PM_SUBTRACTION_EQUATION_KERNELS) { 1347 int numKernels = kernels->num; 1348 for (int i = 0; i < numKernels * numSpatial; i++) { 1349 // XXX fprintf (stderr, "keep\n"); 1350 kernels->solution1->data.F64[i] = solution->data.F64[i]; 1351 kernels->solution2->data.F64[i] = solution->data.F64[i + numSolution1]; 1352 } 1353 } 1354 1304 1355 1305 1356 memcpy(kernels->solution1->data.F64, solution->data.F64, -
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionMatch.c
r26687 r26702 28 28 static bool useFFT = true; // Do convolutions using FFT 29 29 30 # define SEPARATE 030 # define SEPARATE 1 31 31 # if (SEPARATE) 32 32 # define SUBMODE PM_SUBTRACTION_EQUATION_NORM 33 33 # else 34 34 # define SUBMODE PM_SUBTRACTION_EQUATION_ALL 35 // # define SUBMODE PM_SUBTRACTION_EQUATION_KERNELS36 35 # endif 37 36
Note:
See TracChangeset
for help on using the changeset viewer.
