Changeset 1775 for trunk/psLib/src/math/psMinimize.c
- Timestamp:
- Sep 9, 2004, 4:55:59 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psMinimize.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMinimize.c
r1734 r1775 9 9 * @author George Gusciora, MHPCC 10 10 * 11 * @version $Revision: 1.3 5$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-09- 08 23:32:03$11 * @version $Revision: 1.36 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-09-10 02:52:02 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 846 846 /****************************************************************************** 847 847 GUS 848 849 XXX: bug report for the psMatrix covar argument.850 848 *****************************************************************************/ 851 849 bool psMinimizeLM(psMinimization *min, … … 856 854 psMinimizeLMFunc func) 857 855 { 858 /* 859 psVector *beta = psVectorAlloc(params->n, PS_TYPE_F32); 860 psImage *alpha = psImageAlloc(params->n, params->n, PS_TYPE_F32); 861 psVector *deriv; 862 int i; 863 int k; 864 float tmp; 865 866 tmp = func(deriv, params, coords); 867 for (k=0;k<params->n;k++) { 868 beta->data.F32[k] = 0.0; 856 psVector *beta = psVectorAlloc(params->n, PS_TYPE_F32); 857 psVector *perm = psVectorAlloc(params->n, PS_TYPE_F32); 858 psVector *newParams = psVectorAlloc(params->n, PS_TYPE_F32); 859 psImage *alpha = psImageAlloc(params->n, params->n, PS_TYPE_F32); 860 psImage *A = psImageAlloc(params->n, params->n, PS_TYPE_F32); 861 psImage *aOut = psImageAlloc(params->n, params->n, PS_TYPE_F32); 862 psVector *deriv = psVectorAlloc(params->n, PS_TYPE_F32); 863 psVector *newDeriv = psVectorAlloc(params->n, PS_TYPE_F32); 864 int i; 865 int j; 866 int k; 867 float newValue; 868 float oldValue; 869 float lamda = 1.0; 870 871 min->lastDelta = -HUGE; 872 min->iter = 0; 873 min->value = func(deriv, params, coords); 874 875 while ((min->lastDelta > min->tol) && 876 (min->iter < min->maxIter)) { 877 878 for (i=0;i<params->n;i++) { 879 beta->data.F32[i] = deriv->data.F32[i]; 880 } 881 882 for (j=0;j<params->n;j++) { 883 for (k=0;k<params->n;k++) { 884 alpha->data.F32[j][k] = deriv->data.F32[j] * deriv->data.F32[j]; 885 } 886 } 887 for (j=0;j<params->n;j++) { 888 for (k=0;k<params->n;k++) { 889 if (j != k) { 890 A->data.F32[j][k] = alpha->data.F32[j][k]; 891 } else { 892 A->data.F32[j][k] = (1.0 + lamda) * alpha->data.F32[j][k]; 893 } 894 } 895 } 896 aOut = psMatrixLUD(aOut, perm, A); 897 newParams = psMatrixLUSolve(newParams, aOut, beta, perm); 898 899 oldValue = min->value; 900 newValue = func(newDeriv, newParams, coords); 901 if (oldValue > newValue) { 902 min->lastDelta = oldValue - newValue; 903 min->value = newValue; 904 869 905 for (i=0;i<params->n;i++) { 870 beta->data.F32[k]+= deriv 871 } 872 */ 906 params->data.F32[i] = newParams->data.F32[i]; 907 deriv->data.F32[i] = newDeriv->data.F32[i]; 908 } 909 min->value = func(deriv, params, coords); 910 911 lamda*= 0.1; 912 } else { 913 lamda*= 10.0; 914 } 915 min->iter++; 916 } 917 psFree(beta); 918 psFree(perm); 919 psFree(newParams); 920 psFree(alpha); 921 psFree(A); 922 psFree(aOut); 923 psFree(deriv); 924 psFree(newDeriv); 925 926 if ((min->iter < min->maxIter) || 927 (min->lastDelta <= min->tol)) { 928 return(true); 929 } 930 873 931 return(false); 874 932 }
Note:
See TracChangeset
for help on using the changeset viewer.
