Browse Source

Optimize LSF for size, efficiency (#21443)

Ramiro Polla 3 years ago
parent
commit
8bf6b190ff
No account linked to committer's email address
2 changed files with 14 additions and 16 deletions
  1. 13
    13
      Marlin/src/libs/least_squares_fit.cpp
  2. 1
    3
      Marlin/src/libs/least_squares_fit.h

+ 13
- 13
Marlin/src/libs/least_squares_fit.cpp View File

@@ -46,23 +46,23 @@ int finish_incremental_LSF(struct linear_fit_data *lsf) {
46 46
   if (N == 0.0)
47 47
     return 1;
48 48
 
49
-  lsf->xbar /= N;
50
-  lsf->ybar /= N;
51
-  lsf->zbar /= N;
52
-  lsf->x2bar = lsf->x2bar / N - sq(lsf->xbar);
53
-  lsf->y2bar = lsf->y2bar / N - sq(lsf->ybar);
54
-  lsf->z2bar = lsf->z2bar / N - sq(lsf->zbar);
55
-  lsf->xybar = lsf->xybar / N - lsf->xbar * lsf->ybar;
56
-  lsf->yzbar = lsf->yzbar / N - lsf->ybar * lsf->zbar;
57
-  lsf->xzbar = lsf->xzbar / N - lsf->xbar * lsf->zbar;
58
-  const float DD = lsf->x2bar * lsf->y2bar - sq(lsf->xybar);
49
+  const float RN = 1.0f / N,
50
+              xbar = lsf->xbar * RN,
51
+              ybar = lsf->ybar * RN,
52
+              zbar = lsf->zbar * RN,
53
+              x2bar = lsf->x2bar * RN - sq(xbar),
54
+              y2bar = lsf->y2bar * RN - sq(ybar),
55
+              xybar = lsf->xybar * RN - xbar * ybar,
56
+              yzbar = lsf->yzbar * RN - ybar * zbar,
57
+              xzbar = lsf->xzbar * RN - xbar * zbar,
58
+              DD = x2bar * y2bar - sq(xybar);
59 59
 
60 60
   if (ABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy))
61 61
     return 1;
62 62
 
63
-  lsf->A = (lsf->yzbar * lsf->xybar - lsf->xzbar * lsf->y2bar) / DD;
64
-  lsf->B = (lsf->xzbar * lsf->xybar - lsf->yzbar * lsf->x2bar) / DD;
65
-  lsf->D = -(lsf->zbar + lsf->A * lsf->xbar + lsf->B * lsf->ybar);
63
+  lsf->A = (yzbar * xybar - xzbar * y2bar) / DD;
64
+  lsf->B = (xzbar * xybar - yzbar * x2bar) / DD;
65
+  lsf->D = -(zbar + lsf->A * xbar + lsf->B * ybar);
66 66
   return 0;
67 67
 }
68 68
 

+ 1
- 3
Marlin/src/libs/least_squares_fit.h View File

@@ -37,7 +37,7 @@
37 37
 
38 38
 struct linear_fit_data {
39 39
   float xbar, ybar, zbar,
40
-        x2bar, y2bar, z2bar,
40
+        x2bar, y2bar,
41 41
         xybar, xzbar, yzbar,
42 42
         max_absx, max_absy,
43 43
         A, B, D, N;
@@ -56,7 +56,6 @@ inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const
56 56
   lsf->zbar  += wz;
57 57
   lsf->x2bar += wx * x;
58 58
   lsf->y2bar += wy * y;
59
-  lsf->z2bar += wz * z;
60 59
   lsf->xybar += wx * y;
61 60
   lsf->xzbar += wx * z;
62 61
   lsf->yzbar += wy * z;
@@ -74,7 +73,6 @@ inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const f
74 73
   lsf->zbar += z;
75 74
   lsf->x2bar += sq(x);
76 75
   lsf->y2bar += sq(y);
77
-  lsf->z2bar += sq(z);
78 76
   lsf->xybar += x * y;
79 77
   lsf->xzbar += x * z;
80 78
   lsf->yzbar += y * z;

Loading…
Cancel
Save