1
1
#:include "common.fypp"
2
2
#:set RANKS = range(1, MAXRANK + 1)
3
+ #:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
3
4
submodule (stdlib_experimental_stats) stdlib_experimental_stats_var
4
5
5
6
use, intrinsic:: ieee_arithmetic, only: ieee_value, ieee_quiet_nan
@@ -9,55 +10,30 @@ submodule (stdlib_experimental_stats) stdlib_experimental_stats_var
9
10
10
11
contains
11
12
12
- #:for k1, t1 in REAL_KINDS_TYPES
13
+ #:for k1, t1 in RC_KINDS_TYPES
13
14
#:for rank in RANKS
14
15
#:set RName = rname("var_all",rank, t1, k1)
15
- module function ${RName}$(x, mask) result(res)
16
- ${t1}$, intent(in) :: x${ranksuffix(rank)}$
17
- logical, intent(in), optional :: mask
18
- ${t1}$ :: res
19
-
20
- ${t1}$ :: n, mean
21
-
22
- if (.not.optval(mask, .true.)) then
23
- res = ieee_value(1._${k1}$, ieee_quiet_nan)
24
- return
25
- end if
26
-
27
- n = real(size(x, kind = int64), ${k1}$)
28
- mean = sum(x) / n
29
-
30
- res = sum((x - mean)**2) / (n - 1._${k1}$)
31
-
32
- end function ${RName}$
33
- #:endfor
34
- #:endfor
35
-
36
-
37
- #:for k1, t1 in CMPLX_KINDS_TYPES
38
- #:for rank in RANKS
39
- #:set RName = rname("var_all",rank, t1, k1, 'r'+k1)
40
16
module function ${RName}$(x, mask) result(res)
41
17
${t1}$, intent(in) :: x${ranksuffix(rank)}$
42
18
logical, intent(in), optional :: mask
43
19
real(${k1}$) :: res
44
20
45
- real(${k1}$) :: n, mean
21
+ real(${k1}$) :: n
22
+ ${t1}$ :: mean
46
23
47
24
if (.not.optval(mask, .true.)) then
48
25
res = ieee_value(1._${k1}$, ieee_quiet_nan)
49
26
return
50
27
end if
51
28
52
29
n = real(size(x, kind = int64), ${k1}$)
30
+ mean = sum(x) / n
53
31
54
- !real part
55
- mean = sum(real(x)) / n
56
- res = sum((real(x) - mean)**2)
57
-
58
- !imaginary part
59
- mean = sum(aimag(x)) / n
60
- res = (res + sum((aimag(x) - mean)**2)) / (n - 1._${k1}$)
32
+ #:if t1[0] == 'r'
33
+ res = sum((x - mean)**2) / (n - 1._${k1}$)
34
+ #:else
35
+ res = sum(abs(x - mean)**2) / (n - 1._${k1}$)
36
+ #:endif
61
37
62
38
end function ${RName}$
63
39
#:endfor
@@ -89,47 +65,9 @@ contains
89
65
#:endfor
90
66
91
67
92
- #:for k1, t1 in REAL_KINDS_TYPES
68
+ #:for k1, t1 in RC_KINDS_TYPES
93
69
#:for rank in RANKS
94
70
#:set RName = rname("var",rank, t1, k1)
95
- module function ${RName}$(x, dim, mask) result(res)
96
- ${t1}$, intent(in) :: x${ranksuffix(rank)}$
97
- integer, intent(in) :: dim
98
- logical, intent(in), optional :: mask
99
- ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
100
-
101
- integer :: i
102
- ${t1}$ :: n
103
- ${t1}$ :: mean${reduced_shape('x', rank, 'dim')}$
104
-
105
- if (.not.optval(mask, .true.)) then
106
- res = ieee_value(1._${k1}$, ieee_quiet_nan)
107
- return
108
- end if
109
-
110
- res = 0._${k1}$
111
- select case(dim)
112
- #:for fi in range(1, rank+1)
113
- case(${fi}$)
114
- n = real(size(x, dim), ${k1}$)
115
- mean = sum(x, dim) / n
116
- do i = 1, size(x, dim)
117
- res = res + (x${rankindice(':', 'i', rank, fi )}$ - mean)**2
118
- end do
119
- #:endfor
120
- case default
121
- call error_stop("ERROR (mean): wrong dimension")
122
- end select
123
- res = res / (n - 1._${k1}$)
124
-
125
- end function ${RName}$
126
- #:endfor
127
- #:endfor
128
-
129
-
130
- #:for k1, t1 in CMPLX_KINDS_TYPES
131
- #:for rank in RANKS
132
- #:set RName = rname("var",rank, t1, k1, 'r'+k1)
133
71
module function ${RName}$(x, dim, mask) result(res)
134
72
${t1}$, intent(in) :: x${ranksuffix(rank)}$
135
73
integer, intent(in) :: dim
@@ -138,7 +76,7 @@ contains
138
76
139
77
integer :: i
140
78
real(${k1}$) :: n
141
- real(${k1}$) :: mean${reduced_shape('x', rank, 'dim')}$
79
+ ${t1}$ :: mean${reduced_shape('x', rank, 'dim')}$
142
80
143
81
if (.not.optval(mask, .true.)) then
144
82
res = ieee_value(1._${k1}$, ieee_quiet_nan)
@@ -150,15 +88,13 @@ contains
150
88
#:for fi in range(1, rank+1)
151
89
case(${fi}$)
152
90
n = real(size(x, dim), ${k1}$)
153
- !real part
154
- mean = sum(real(x), dim) / n
155
- do i = 1, size(x, dim)
156
- res = res + (real(x${rankindice(':', 'i', rank, fi )}$) - mean)**2
157
- end do
158
- !imaginary part
159
- mean = sum(aimag(x), dim) / n
91
+ mean = sum(x, dim) / n
160
92
do i = 1, size(x, dim)
161
- res = res + (aimag(x${rankindice(':', 'i', rank, fi )}$) - mean)**2
93
+ #:if t1[0] == 'r'
94
+ res = res + (x${rankindice(':', 'i', rank, fi )}$ - mean)**2
95
+ #:else
96
+ res = res + abs(x${rankindice(':', 'i', rank, fi )}$ - mean)**2
97
+ #:endif
162
98
end do
163
99
#:endfor
164
100
case default
@@ -209,45 +145,25 @@ contains
209
145
#:endfor
210
146
211
147
212
- #:for k1, t1 in REAL_KINDS_TYPES
148
+ #:for k1, t1 in RC_KINDS_TYPES
213
149
#:for rank in RANKS
214
150
#:set RName = rname("var_mask_all",rank, t1, k1)
215
- module function ${RName}$(x, mask) result(res)
216
- ${t1}$, intent(in) :: x${ranksuffix(rank)}$
217
- logical, intent(in) :: mask${ranksuffix(rank)}$
218
- ${t1}$ :: res
219
-
220
- ${t1}$ :: n, mean
221
-
222
- n = real(count(mask, kind = int64), ${k1}$)
223
- mean = sum(x, mask) / n
224
-
225
- res = sum((x - mean)**2, mask) / (n - 1._${k1}$)
226
-
227
- end function ${RName}$
228
- #:endfor
229
- #:endfor
230
-
231
-
232
- #:for k1, t1 in CMPLX_KINDS_TYPES
233
- #:for rank in RANKS
234
- #:set RName = rname("var_mask_all",rank, t1, k1, 'r'+k1)
235
151
module function ${RName}$(x, mask) result(res)
236
152
${t1}$, intent(in) :: x${ranksuffix(rank)}$
237
153
logical, intent(in) :: mask${ranksuffix(rank)}$
238
154
real(${k1}$) :: res
239
155
240
- real(${k1}$) :: n, mean
156
+ real(${k1}$) :: n
157
+ ${t1}$ :: mean
241
158
242
159
n = real(count(mask, kind = int64), ${k1}$)
160
+ mean = sum(x, mask) / n
243
161
244
- !real part
245
- mean = sum(real(x), mask) / n
246
- res = sum((real(x) - mean)**2, mask)
247
-
248
- !imaginary part
249
- mean = sum(aimag(x), mask) / n
250
- res = (res + sum((aimag(x) - mean)**2, mask)) / (n - 1._${k1}$)
162
+ #:if t1[0] == 'r'
163
+ res = sum((x - mean)**2, mask) / (n - 1._${k1}$)
164
+ #:else
165
+ res = sum(abs(x - mean)**2, mask) / (n - 1._${k1}$)
166
+ #:endif
251
167
252
168
end function ${RName}$
253
169
#:endfor
@@ -274,44 +190,9 @@ contains
274
190
#:endfor
275
191
276
192
277
- #:for k1, t1 in REAL_KINDS_TYPES
193
+ #:for k1, t1 in RC_KINDS_TYPES
278
194
#:for rank in RANKS
279
195
#:set RName = rname("var_mask",rank, t1, k1)
280
- module function ${RName}$(x, dim, mask) result(res)
281
- ${t1}$, intent(in) :: x${ranksuffix(rank)}$
282
- integer, intent(in) :: dim
283
- logical, intent(in) :: mask${ranksuffix(rank)}$
284
- ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
285
-
286
- integer :: i
287
- ${t1}$ :: n${reduced_shape('x', rank, 'dim')}$
288
- ${t1}$ :: mean${reduced_shape('x', rank, 'dim')}$
289
-
290
- res = 0._${k1}$
291
- select case(dim)
292
- #:for fi in range(1, rank+1)
293
- case(${fi}$)
294
- n = real(count(mask, dim), ${k1}$)
295
- mean = sum(x, dim, mask) / n
296
- do i = 1, size(x, dim)
297
- res = res + merge( (x${rankindice(':', 'i', rank, fi )}$ - mean)**2,&
298
- 0._${k1}$,&
299
- mask${rankindice(':', 'i', rank, fi)}$)
300
- end do
301
- #:endfor
302
- case default
303
- call error_stop("ERROR (mean): wrong dimension")
304
- end select
305
- res = res / (n - 1._${k1}$)
306
-
307
- end function ${RName}$
308
- #:endfor
309
- #:endfor
310
-
311
-
312
- #:for k1, t1 in CMPLX_KINDS_TYPES
313
- #:for rank in RANKS
314
- #:set RName = rname("var_mask",rank, t1, k1, 'r'+k1)
315
196
module function ${RName}$(x, dim, mask) result(res)
316
197
${t1}$, intent(in) :: x${ranksuffix(rank)}$
317
198
integer, intent(in) :: dim
@@ -320,24 +201,20 @@ contains
320
201
321
202
integer :: i
322
203
real(${k1}$) :: n${reduced_shape('x', rank, 'dim')}$
323
- real(${k1}$) :: mean${reduced_shape('x', rank, 'dim')}$
204
+ ${t1}$ :: mean${reduced_shape('x', rank, 'dim')}$
324
205
325
206
res = 0._${k1}$
326
207
select case(dim)
327
208
#:for fi in range(1, rank+1)
328
209
case(${fi}$)
329
210
n = real(count(mask, dim), ${k1}$)
330
- !real part
331
- mean = sum(real(x), dim, mask) / n
332
- do i = 1, size(x, dim)
333
- res = res + merge( (real(x${rankindice(':', 'i', rank, fi )}$) - mean)**2,&
334
- 0._${k1}$,&
335
- mask${rankindice(':', 'i', rank, fi)}$)
336
- end do
337
- !imaginary part
338
- mean = sum(aimag(x), dim, mask) / n
211
+ mean = sum(x, dim, mask) / n
339
212
do i = 1, size(x, dim)
340
- res = res + merge( (aimag(x${rankindice(':', 'i', rank, fi )}$) - mean)**2,&
213
+ #:if t1[0] == 'r'
214
+ res = res + merge( (x${rankindice(':', 'i', rank, fi )}$ - mean)**2,&
215
+ #:else
216
+ res = res + merge( abs(x${rankindice(':', 'i', rank, fi )}$ - mean)**2,&
217
+ #:endif
341
218
0._${k1}$,&
342
219
mask${rankindice(':', 'i', rank, fi)}$)
343
220
end do
0 commit comments