浏览代码

Optimize LSF for size, efficiency (#21443)

Ramiro Polla 4 年前
父节点
当前提交
8bf6b190ff
没有帐户链接到提交者的电子邮件
共有 2 个文件被更改,包括 14 次插入16 次删除
  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 查看文件

46
   if (N == 0.0)
46
   if (N == 0.0)
47
     return 1;
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
   if (ABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy))
60
   if (ABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy))
61
     return 1;
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
   return 0;
66
   return 0;
67
 }
67
 }
68
 
68
 

+ 1
- 3
Marlin/src/libs/least_squares_fit.h 查看文件

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

正在加载...
取消
保存