Skip to content

Commit e586bff

Browse files
committed
stat_mean_dev_2: replacing loops by sum for real arrays
1 parent 7d9b916 commit e586bff

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
@@ -18,13 +18,7 @@ module function mean_1_${k1}$_${k1}$(x) result(res)
1818
${t1}$, intent(in) :: x(:)
1919
${t1}$ :: res
2020

21-
integer :: i1
22-
23-
res = 0.0_${k1}$
24-
do i1 = 1, size(x)
25-
res = res + x(i1)
26-
end do
27-
res = res / real(size(x), ${k1}$)
21+
res = sum(x) / real(size(x), ${k1}$)
2822

2923
end function mean_1_${k1}$_${k1}$
3024
#:endfor
@@ -51,15 +45,7 @@ module function mean_2_all_${k1}$_${k1}$(x) result(res)
5145
${t1}$, intent(in) :: x(:,:)
5246
${t1}$ :: res
5347

54-
integer :: i1, i2
55-
56-
res = 0.0_${k1}$
57-
do i2 = 1, size(x, 2)
58-
do i1 = 1, size(x, 1)
59-
res = res + x(i1, i2)
60-
end do
61-
end do
62-
res = res / real(size(x), ${k1}$)
48+
res = sum(x) / real(size(x), ${k1}$)
6349

6450
end function mean_2_all_${k1}$_${k1}$
6551
#:endfor
@@ -88,29 +74,15 @@ module function mean_2_${k1}$_${k1}$(x, dim) result(res)
8874
integer, intent(in) :: dim
8975
${t1}$ :: res(size(x)/size(x, dim))
9076

91-
integer :: i1, i2
92-
93-
res = 0.0_${k1}$
94-
9577
select case(dim)
9678
case(1)
97-
do i2 = 1, size(x, 2)
98-
do i1 = 1, size(x, 1)
99-
res(i2) = res(i2) + x(i1, i2)
100-
end do
101-
end do
79+
res = sum(x, 1) / real(size(x, 1), ${k1}$)
10280
case(2)
103-
do i2 = 1, size(x, 2)
104-
do i1 = 1, size(x, 1)
105-
res(i1) = res(i1) + x(i1, i2)
106-
end do
107-
end do
81+
res = sum(x, 2) / real(size(x, 2), ${k1}$)
10882
case default
10983
call error_stop("ERROR (mean): wrong dimension")
11084
end select
11185

112-
res = res / real(size(x, dim), ${k1}$)
113-
11486
end function mean_2_${k1}$_${k1}$
11587
#:endfor
11688

@@ -180,19 +152,7 @@ module function mean_${rank}$_all_${k1}$_${k1}$(x) result(res)
180152
${t1}$, intent(in) :: x${ranksuffix(rank)}$
181153
${t1}$ :: res
182154

183-
integer :: ${varlist("i",1,rank)}$
184-
185-
res = 0.0_${k1}$
186-
187-
#:for fj in range(rank,0,-1)
188-
${" "* (rank - fj)}$do i${varsuffix(fj)}$ = 1, size(x, ${fj}$)
189-
#:endfor
190-
${" "* (rank)}$res = res + x(${varlist("i",1,rank)}$)
191-
#:for fj in range(rank,0,-1)
192-
${" "* (fj-1)}$end do
193-
#:endfor
194-
195-
res = res / real(size(x), ${k1}$)
155+
res = sum(x) / real(size(x), ${k1}$)
196156

197157
end function mean_${rank}$_all_${k1}$_${k1}$
198158
#:endfor
@@ -233,27 +193,15 @@ module function mean_${rank}$_${k1}$_${k1}$(x, dim) result(res)
233193
#:endfor
234194
merge(size(x,${rank-1}$),size(x,${rank}$),mask = ${rank-1}$ < dim ) )
235195

236-
integer :: ${varlist("i",1,rank)}$
237-
238-
res = 0.0_${k1}$
239-
240196
select case(dim)
241197
#:for fi in range(1,rank+1)
242198
case(${fi}$)
243-
#:for fj in range(rank,0,-1)
244-
${" "* (rank - fj)}$do i${varsuffix(fj)}$ = 1, size(x, ${fj}$)
245-
#:endfor
246-
${" "* (rank)}$res(${varlistskip("i", rank, fi)}$) = res(${varlistskip("i", rank, fi)}$) + x(${varlist("i",1,rank)}$)
247-
#:for fj in range(rank,0,-1)
248-
${" "* (fj-1)}$end do
249-
#:endfor
199+
res=sum(x, ${fi}$) / real(size(x, ${fi}$), ${k1}$)
250200
#:endfor
251201
case default
252202
call error_stop("ERROR (mean): wrong dimension")
253203
end select
254204

255-
res = res / real(size(x, dim), ${k1}$)
256-
257205
end function mean_${rank}$_${k1}$_${k1}$
258206
#:endfor
259207
#:endfor

0 commit comments

Comments
 (0)