Skip to content

Commit 4be0916

Browse files
author
Carl Burkert
committed
Reduce redundancy in moment_all functions
The if-else-blocks in the moment_all functions couldn't be replaced with the optval function, because this would lead to poor performance. If the center variable is present, the calculation of the mean can be skipped, but the optval function prevents this optimisation.
1 parent 0e6c2f6 commit 4be0916

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/stdlib_stats_moment_all.fypp

+16-8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ contains
2222
${t1}$ :: res
2323

2424
real(${k1}$) :: n
25+
${t1}$ :: center_
2526

2627
if (.not.optval(mask, .true.)) then
2728
res = ieee_value(1._${k1}$, ieee_quiet_nan)
@@ -31,10 +32,11 @@ contains
3132
n = real(size(x, kind = int64), ${k1}$)
3233

3334
if (present(center)) then
34-
res = sum((x - center)**order) / n
35+
center_ = center
3536
else
36-
res = sum((x - mean(x))**order) / n
37+
center_ = mean(x)
3738
end if
39+
res = sum((x - center_)**order) / n
3840

3941
end function ${RName}$
4042
#:endfor
@@ -52,6 +54,7 @@ contains
5254
real(dp) :: res
5355

5456
real(dp) :: n
57+
real(dp) :: center_
5558

5659
if (.not.optval(mask, .true.)) then
5760
res = ieee_value(1._dp, ieee_quiet_nan)
@@ -61,10 +64,11 @@ contains
6164
n = real(size(x, kind = int64), dp)
6265

6366
if (present(center)) then
64-
res = sum((real(x, dp) - center)**order) / n
67+
center_ = center
6568
else
66-
res = sum((real(x, dp) - mean(x))**order) / n
69+
center_ = mean(x)
6770
end if
71+
res = sum((real(x, dp) - center_)**order) / n
6872

6973
end function ${RName}$
7074
#:endfor
@@ -82,14 +86,16 @@ contains
8286
${t1}$ :: res
8387

8488
real(${k1}$) :: n
89+
${t1}$ :: center_
8590

8691
n = real(count(mask, kind = int64), ${k1}$)
8792

8893
if (present(center)) then
89-
res = sum((x - center)**order, mask) / n
94+
center_ = center
9095
else
91-
res = sum((x - mean(x, mask))**order, mask) / n
96+
center_ = mean(x, mask)
9297
end if
98+
res = sum((x - center_)**order, mask) / n
9399

94100
end function ${RName}$
95101
#:endfor
@@ -107,14 +113,16 @@ contains
107113
real(dp) :: res
108114

109115
real(dp) :: n
116+
real(dp) :: center_
110117

111118
n = real(count(mask, kind = int64), dp)
112119

113120
if (present(center)) then
114-
res = sum((real(x, dp) - center)**order, mask) / n
121+
center_ = center
115122
else
116-
res = sum((real(x, dp) - mean(x,mask))**order, mask) / n
123+
center_ = mean(x, mask)
117124
end if
125+
res = sum((real(x, dp) - center_)**order, mask) / n
118126

119127
end function ${RName}$
120128
#:endfor

0 commit comments

Comments
 (0)