/numerical-recipes-j/core/src/main/legacy/nr2/C_211/recipes/memcof.c

https://github.com/githubapitest/githubapitest · C · 46 lines · 43 code · 3 blank · 0 comment · 9 complexity · 459044bfd5559b16d2b1f054f8b524e9 MD5 · raw file

  1. #include <math.h>
  2. #define NRANSI
  3. #include "nrutil.h"
  4. void memcof(float data[], int n, int m, float *xms, float d[])
  5. {
  6. int k,j,i;
  7. float p=0.0,*wk1,*wk2,*wkm;
  8. wk1=vector(1,n);
  9. wk2=vector(1,n);
  10. wkm=vector(1,m);
  11. for (j=1;j<=n;j++) p += SQR(data[j]);
  12. *xms=p/n;
  13. wk1[1]=data[1];
  14. wk2[n-1]=data[n];
  15. for (j=2;j<=n-1;j++) {
  16. wk1[j]=data[j];
  17. wk2[j-1]=data[j];
  18. }
  19. for (k=1;k<=m;k++) {
  20. float num=0.0,denom=0.0;
  21. for (j=1;j<=(n-k);j++) {
  22. num += wk1[j]*wk2[j];
  23. denom += SQR(wk1[j])+SQR(wk2[j]);
  24. }
  25. d[k]=2.0*num/denom;
  26. *xms *= (1.0-SQR(d[k]));
  27. for (i=1;i<=(k-1);i++)
  28. d[i]=wkm[i]-d[k]*wkm[k-i];
  29. if (k == m) {
  30. free_vector(wkm,1,m);
  31. free_vector(wk2,1,n);
  32. free_vector(wk1,1,n);
  33. return;
  34. }
  35. for (i=1;i<=k;i++) wkm[i]=d[i];
  36. for (j=1;j<=(n-k-1);j++) {
  37. wk1[j] -= wkm[k]*wk2[j];
  38. wk2[j]=wk2[j+1]-wkm[k]*wk1[j+1];
  39. }
  40. }
  41. nrerror("never get here in memcof.");
  42. }
  43. #undef NRANSI