Changeset 5827 for branches/eam_rel9_b1/psLib/src/math/psMinimize.c
- Timestamp:
- Dec 22, 2005, 4:09:39 PM (21 years ago)
- File:
-
- 1 edited
-
branches/eam_rel9_b1/psLib/src/math/psMinimize.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_rel9_b1/psLib/src/math/psMinimize.c
r5812 r5827 10 10 * @author EAM, IfA 11 11 * 12 * @version $Revision: 1.147.4.1.2. 4$ $Name: not supported by cvs2svn $13 * @date $Date: 2005-12- 19 19:44:27$12 * @version $Revision: 1.147.4.1.2.5 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2005-12-23 02:09:39 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 1463 1463 psF64 zSum = 1.0; 1464 1464 1465 psF64 ***vsX; 1466 psF64 **vsY; 1467 psF64 *vsZ; 1468 1465 1469 nXsum = 2*nXterm; 1466 1470 nYsum = 2*nYterm; … … 1477 1481 // careful with this function: there is no size checking and realloc for reuse 1478 1482 1479 zSum = 1.0; 1480 for (int k = 0; k < nZsum; k++) { 1481 ySum = zSum; 1482 for (int j = 0; j < nYsum; j++) { 1483 xSum = ySum; 1484 for (int i = 0; i < nXsum; i++) { 1485 sums[i][j][k] = xSum; 1486 xSum *= x; 1483 xSum = 1.0; 1484 vsX = sums; 1485 for (int i = 0; i < nXsum; i++, vsX++) { 1486 ySum = xSum; 1487 vsY = *vsX; 1488 for (int j = 0; j < nYsum; j++, vsY++) { 1489 zSum = ySum; 1490 vsZ = *vsY; 1491 for (int k = 0; k < nZsum; k++, vsZ++) { 1492 // sums[i][j][k] = xSum; 1493 *vsZ = zSum; 1494 zSum *= z; 1487 1495 } 1488 1496 ySum *= y; 1489 1497 } 1490 zSum *= z;1498 xSum *= x; 1491 1499 } 1492 1500 return (sums); … … 2636 2644 psImageInit (A, 0.0); 2637 2645 2646 // use these pointers to minimize the indirections 2647 psF64 *vB = B->data.F64; 2648 psF64 **vA = A->data.F64; 2649 psU8 ***vM = myPoly->mask; 2650 2638 2651 // Sums look like: 1, x, x^2, ... x^(2n+1), y, xy, x^2y, ... x^(2n+1)*y, ... 2652 2653 # define NTERM(X,Y,Z)((X)*nYterm*nZterm + (Y)*nZterm + (Z)) 2639 2654 2640 2655 // Build the B and A data structs. … … 2658 2673 for (int iy = 0; iy < nYterm; iy++) { 2659 2674 for (int iz = 0; iz < nZterm; iz++) { 2660 if ( myPoly->mask[ix][iy][iz])2675 if (vM[ix][iy][iz]) 2661 2676 continue; 2662 int nx = ix+iy*nXterm+iz*nXterm*nYterm;2663 B->data.F64[nx] += f->data.F64[k] * Sums[ix][iy][iz] * wt;2677 int nx = NTERM(ix,iy,iz); 2678 vB[nx] += f->data.F64[k] * Sums[ix][iy][iz] * wt; 2664 2679 } 2665 2680 } … … 2669 2684 for (int iy = 0; iy < nYterm; iy++) { 2670 2685 for (int iz = 0; iz < nZterm; iz++) { 2671 if ( myPoly->mask[ix][iy][iz])2686 if (vM[ix][iy][iz]) 2672 2687 continue; 2673 int nx = ix+iy*nXterm+iz*nXterm*nYterm;2674 for (int jx = 0; jx < nXterm; jx++) {2675 for (int jy = 0; jy < nYterm; jy++) {2676 for (int jz = 0; jz < nZterm; jz++) {2677 if ( myPoly->mask[jx][jy][jz])2688 int nx = NTERM(ix,iy,iz); 2689 for (int jx = ix; jx < nXterm; jx++) { 2690 for (int jy = (jx == ix) ? 0 : 0; jy < nYterm; jy++) { 2691 for (int jz = (jy == iy) ? 0 : 0; jz < nZterm; jz++) { 2692 if (vM[jx][jy][jz]) 2678 2693 continue; 2679 int ny = jx+jy*nXterm+jz*nXterm*nYterm;2680 A->data.F64[nx][ny] += Sums[ix+jx][iy+jy][iz+jz] * wt;2694 int ny = NTERM(jx,jy,jz); 2695 vA[nx][ny] += Sums[ix+jx][iy+jy][iz+jz] * wt; 2681 2696 } 2682 2697 } … … 2687 2702 } 2688 2703 2704 // fill in upper half of matrix A 2705 for (int nx = 0; nx < nTerm; nx++) { 2706 for (int ny = 0; ny < nx; ny++) { 2707 vA[nx][ny] = vA[ny][nx]; 2708 } 2709 } 2710 2689 2711 for (int ix = 0; ix < nXterm; ix++) { 2690 2712 for (int iy = 0; iy < nYterm; iy++) { 2691 2713 for (int iz = 0; iz < nZterm; iz++) { 2692 if (! myPoly->mask[ix][iy][iz])2714 if (!vM[ix][iy][iz]) 2693 2715 continue; 2694 int nx = ix+iy*nXterm+iz*nXterm*nYterm;2695 B->data.F64[nx] = 0;2716 int nx = NTERM(ix,iy,iz); 2717 vB[nx] = 0; 2696 2718 for (int jx = 0; jx < nXterm; jx++) { 2697 2719 for (int jy = 0; jy < nYterm; jy++) { 2698 2720 for (int jz = 0; jz < nZterm; jz++) { 2699 int ny = jx+jy*nXterm+jz*nXterm*nYterm;2700 A->data.F64[nx][ny] = (nx == ny) ? 1 : 0;2721 int ny = NTERM(jx,jy,jz); 2722 vA[nx][ny] = (nx == ny) ? 1 : 0; 2701 2723 } 2702 2724 } … … 2713 2735 for (int iy = 0; iy < nYterm; iy++) { 2714 2736 for (int iz = 0; iz < nZterm; iz++) { 2715 int nx = ix+iy*nXterm+iz*nXterm*nYterm;2716 myPoly->coeff[ix][iy][iz] = B->data.F64[nx];2717 myPoly->coeffErr[ix][iy][iz] = sqrt( A->data.F64[nx][nx]);2737 int nx = NTERM(ix,iy,iz); 2738 myPoly->coeff[ix][iy][iz] = vB[nx]; 2739 myPoly->coeffErr[ix][iy][iz] = sqrt(vA[nx][nx]); 2718 2740 } 2719 2741 } … … 2782 2804 PS_ASSERT_VECTOR_NON_NULL(x, NULL); 2783 2805 PS_ASSERT_VECTORS_SIZE_EQUAL(f, x, NULL); 2806 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(x, NULL); 2784 2807 if (x->type.type != PS_TYPE_F64) { 2785 2808 PS_VECTOR_GEN_F64_FROM_F32(x64, x); … … 2793 2816 PS_ASSERT_VECTOR_NON_NULL(y, NULL); 2794 2817 PS_ASSERT_VECTORS_SIZE_EQUAL(f, y, NULL); 2818 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(y, NULL); 2795 2819 if (y->type.type != PS_TYPE_F64) { 2796 2820 PS_VECTOR_GEN_F64_FROM_F32(y64, y); … … 2804 2828 PS_ASSERT_VECTOR_NON_NULL(z, NULL); 2805 2829 PS_ASSERT_VECTORS_SIZE_EQUAL(f, z, NULL); 2830 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(z, NULL); 2806 2831 if (z->type.type != PS_TYPE_F64) { 2807 PS_VECTOR_GEN_F64_FROM_F32( y64, z);2832 PS_VECTOR_GEN_F64_FROM_F32(z64, z); 2808 2833 } else { 2809 2834 z64 = (psVector *) z;
Note:
See TracChangeset
for help on using the changeset viewer.
