Skip to content

Commit 8d9e475

Browse files
committed
stat_mean_dev_3: replace all loops by the function sum
1 parent 4005374 commit 8d9e475

File tree

1 file changed

+6
-58
lines changed

1 file changed

+6
-58
lines changed

src/stdlib_experimental_stats_mean.fypp

Lines changed: 6 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,7 @@ module function mean_1_${k1}$_dp(x) result(res)
2828
${t1}$, intent(in) :: x(:)
2929
real(dp) :: res
3030

31-
integer :: i1
32-
33-
res = 0.0_dp
34-
do i1 = 1, size(x)
35-
res = res + real(x(i1), dp)
36-
end do
37-
res = res / real(size(x), dp)
31+
res = sum(real(x, dp)) / real(size(x), dp)
3832

3933
end function mean_1_${k1}$_dp
4034
#:endfor
@@ -55,15 +49,7 @@ module function mean_2_all_${k1}$_dp(x) result(res)
5549
${t1}$, intent(in) :: x(:,:)
5650
real(dp) :: res
5751

58-
integer :: i1, i2
59-
60-
res = 0.0_dp
61-
do i2 = 1, size(x, 2)
62-
do i1 = 1, size(x, 1)
63-
res = res + real(x(i1, i2), dp)
64-
end do
65-
end do
66-
res = res / real(size(x), dp)
52+
res = sum(real(x, dp)) / real(size(x), dp)
6753

6854
end function mean_2_all_${k1}$_dp
6955
#:endfor
@@ -92,29 +78,15 @@ module function mean_2_${k1}$_dp(x, dim) result(res)
9278
integer, intent(in) :: dim
9379
real(dp) :: res(size(x)/size(x, dim))
9480

95-
integer :: i1, i2
96-
97-
res = 0.0_dp
98-
9981
select case(dim)
10082
case(1)
101-
do i2 = 1, size(x, 2)
102-
do i1 = 1, size(x, 1)
103-
res(i2) = res(i2) + real(x(i1, i2), dp)
104-
end do
105-
end do
83+
res = sum(real(x, dp), 1) / real(size(x, 1), dp)
10684
case(2)
107-
do i2 = 1, size(x, 2)
108-
do i1 = 1, size(x, 1)
109-
res(i1) = res(i1) + real(x(i1, i2), dp)
110-
end do
111-
end do
85+
res = sum(real(x, dp), 2) / real(size(x, 2), dp)
11286
case default
11387
call error_stop("ERROR (mean): wrong dimension")
11488
end select
11589

116-
res = res / real(size(x, dim), dp)
117-
11890
end function mean_2_${k1}$_dp
11991
#:endfor
12092

@@ -164,19 +136,7 @@ module function mean_${rank}$_all_${k1}$_dp(x) result(res)
164136
${t1}$, intent(in) :: x${ranksuffix(rank)}$
165137
real(dp) :: res
166138

167-
integer :: ${varlist("i",1,rank)}$
168-
169-
res = 0.0_dp
170-
171-
#:for fj in range(rank,0,-1)
172-
${" "* (rank - fj)}$do i${varsuffix(fj)}$ = 1, size(x, ${fj}$)
173-
#:endfor
174-
${" "* (rank)}$res = res + real(x(${varlist("i",1,rank)}$), dp)
175-
#:for fj in range(rank,0,-1)
176-
${" "* (fj-1)}$end do
177-
#:endfor
178-
179-
res = res / real(size(x), dp)
139+
res = sum(real(x, dp)) / real(size(x), dp)
180140

181141
end function mean_${rank}$_all_${k1}$_dp
182142
#:endfor
@@ -217,27 +177,15 @@ module function mean_${rank}$_${k1}$_dp(x, dim) result(res)
217177
#:endfor
218178
merge(size(x,${rank-1}$),size(x,${rank}$),mask = ${rank-1}$ < dim ) )
219179

220-
integer :: ${varlist("i",1,rank)}$
221-
222-
res = 0.0_dp
223-
224180
select case(dim)
225181
#:for fi in range(1,rank+1)
226182
case(${fi}$)
227-
#:for fj in range(rank,0,-1)
228-
${" "* (rank - fj)}$do i${varsuffix(fj)}$ = 1, size(x, ${fj}$)
229-
#:endfor
230-
${" "* (rank)}$res(${varlistskip("i", rank, fi)}$) = res(${varlistskip("i", rank, fi)}$) + real(x(${varlist("i",1,rank)}$), dp)
231-
#:for fj in range(rank,0,-1)
232-
${" "* (fj-1)}$end do
233-
#:endfor
183+
res=sum(real(x, dp), ${fi}$) / real(size(x, ${fi}$), dp)
234184
#:endfor
235185
case default
236186
call error_stop("ERROR (mean): wrong dimension")
237187
end select
238188

239-
res = res / real(size(x, dim), dp)
240-
241189
end function mean_${rank}$_${k1}$_dp
242190
#:endfor
243191
#:endfor

0 commit comments

Comments
 (0)