This graph shows which files directly or indirectly include this file:
Go to the source code of this file.
Classes | |
struct | methodName |
Enumerations | |
enum | rotationScratch { GFNORM = 0, GKNORM, GLABELS, NTRASH } |
enum | rotationMethods { IVARIMAX = 0, IQUARTIMAX, IEQUIMAX, IORTHOMAX, IOBLIMIN, NMETHODS, NOTAVAILABLE = IOBLIMIN } |
Functions | |
int | varmx (float *aload, int nv, int nf, int method, float *params, float *fnorm, int itmax, float eps, int verbose) |
enum rotationMethods |
Definition at line 30 of file varimax.h.
00031 { 00032 IVARIMAX = 0, 00033 IQUARTIMAX, 00034 IEQUIMAX, 00035 IORTHOMAX, 00036 IOBLIMIN, 00037 NMETHODS, 00038 NOTAVAILABLE = IOBLIMIN /* first non-implemented recognized method*/ 00039 };
enum rotationScratch |
int varmx | ( | float * | aload, | |
int | nv, | |||
int | nf, | |||
int | method, | |||
float * | params, | |||
float * | fnorm, | |||
int | itmax, | |||
float | eps, | |||
int | verbose | |||
) |
Definition at line 120 of file varimax.cpp.
References b, compcrit(), IORTHOMAX, and t.
Referenced by EMAN::varimax::analyze(), and doRotation().
00124 { 00125 float crit, startCrit, fnv = (float) nv; 00126 float *aloadj, *aloadk; 00127 float denominator, numerator, angl, trot; 00128 float eps1 = eps, eps2 = eps; 00129 float lambda = 0.0; //avoid use lambda uninitialized 00130 int inoim = 0, ict = 0, irot = 0; 00131 int i, j, k, iflip, nf1 = nf - 1; 00132 00133 if (method <= IORTHOMAX) 00134 { 00135 lambda = params[0]; 00136 } 00137 00138 startCrit = crit = compcrit(aload, nv, nf, lambda); 00139 00140 do /*while (inoim < 2 && ict < itmax && iflip);*/ 00141 { 00142 float oldCrit = crit; 00143 00144 iflip = 0; 00145 aloadj = aload; 00146 00147 for (j = 0;j < nf1 ;j++) 00148 { 00149 aloadk = aloadj + nv; 00150 for (k = j + 1;k < nf ;k++) 00151 { 00152 float a = 0.0, b = 0.0, c = 0.0, d = 0.0, s = 0.0; 00153 00154 for (i = 0;i < nv ;i++) 00155 { 00156 float c2 = aloadj[i]*aloadj[i] - aloadk[i]*aloadk[i]; 00157 float s2 = 2.0f*aloadj[i]*aloadk[i]; 00158 00159 a += c2; 00160 b += s2; 00161 c += c2*c2 - s2*s2; 00162 d += c2*s2; 00163 } /*for (i = 0;i < nv ;i++)*/ 00164 00165 denominator = fnv*c + lambda*(b*b - a*a); 00166 numerator = 2.0f*(fnv*d - lambda*a*b); 00167 00168 if (fabs(numerator) > eps1*fabs(denominator)) 00169 { 00170 iflip = 1; 00171 irot++; 00172 angl = 0.25f*atan2(numerator,denominator); 00173 00174 c = cos(angl); 00175 s = sin(angl); 00176 for (i = 0;i < nv ;i++) 00177 { 00178 float t = c*aloadj[i] + s*aloadk[i]; 00179 00180 aloadk[i] = -s*aloadj[i] + c*aloadk[i]; 00181 aloadj[i] = t; 00182 } /*for (i = 0;i < nv ;i++)*/ 00183 } /*if (fabs(numerator) >= eps1*fabs(denominator))*/ 00184 aloadk += nv; 00185 } /*for (k = j + 1;k < nf ;k++)*/ 00186 aloadj += nv; 00187 } /*for (j = 0;j < nf1 ;j++)*/ 00188 ict++; 00189 00190 crit = compcrit(aload, nv, nf, lambda); 00191 trot = (crit > 0.0f) ? (crit - oldCrit)/crit : 0.0f; 00192 inoim++; 00193 if (trot > eps2) 00194 { 00195 inoim = 0; 00196 } 00197 } while (inoim < 2 && ict < itmax && iflip); 00198 00199 if (fnorm != (float *) 0) 00200 { 00201 aloadj = aload; 00202 for (j = 0;j < nf ;j++) 00203 { 00204 float ssj = 0, sj = 0; 00205 00206 for (i = 0;i < nv ;i++) 00207 { 00208 sj += aloadj[i]; 00209 ssj += aloadj[i]*aloadj[i]; 00210 } /*for (i = 0;i < nv ;i++)*/ 00211 fnorm[j] = ssj; 00212 if (sj <= 0.0) 00213 { 00214 for (i = 0;i < nv ;i++) 00215 { 00216 aloadj[i] = -aloadj[i]; 00217 } 00218 } /*if (sj <= 0.0)*/ 00219 00220 aloadk = aload; 00221 for (k = 0;k < j ;k++) 00222 { 00223 if (fnorm[k] < fnorm[j]) 00224 { 00225 float t = fnorm[k]; 00226 00227 fnorm[k] = fnorm[j]; 00228 fnorm[j] = t; 00229 for (i = 0;i < nv ;i++) 00230 { 00231 t = aloadj[i]; 00232 aloadj[i] = aloadk[i]; 00233 aloadk[i] = t; 00234 } /*for (i = 0;i < nv ;i++)*/ 00235 } /*if (fnorm[k] < fnorm[j])*/ 00236 aloadk += nv; 00237 } /*for (k = 0;k < j ;k++)*/ 00238 aloadj += nv; 00239 } /*for (j = 0;j < nf ;j++)*/ 00240 } /*if (fnorm != (float *) 0)*/ 00241 00242 /* 00243 if (verbose) 00244 { 00245 char *outstr = OUTSTR; 00246 00247 outstr += formatChar(outstr, Methods[method].name, CHARASIS); 00248 outstr += formatChar(outstr, " starting criterion = ", CHARASIS); 00249 outstr += formatDouble(outstr, startCrit, DODEFAULT | TRIMLEFT); 00250 outstr += formatChar(outstr, ", final criterion = ", CHARASIS); 00251 outstr += formatDouble(outstr, crit, DODEFAULT | TRIMLEFT); 00252 putOUTSTR(); 00253 sprintf(OUTSTR, "%ld iterations and %ld rotations", ict, irot); 00254 putOUTSTR(); 00255 } if (verbose)*/ 00256 00257 return (ict < itmax); 00258 } /*varmx()*/