@@ -178,52 +178,58 @@ contains
178178 , merge(size(x, 1), size(x, 2), mask = 1<dim))
179179
180180 integer :: i, j, n
181- ${t1}$ :: mean_(merge(size(x, 1), size(x, 2), mask = 1<dim))
182- ${t1}$ :: center(size(x, 1),size(x, 2))
181+ ${t1}$ :: centeri_(merge(size(x, 2), size(x, 1), mask = 1<dim))
182+ ${t1}$ :: centerj_(merge(size(x, 2), size(x, 1), mask = 1<dim))
183+ logical :: mask_(merge(size(x, 2), size(x, 1), mask = 1<dim))
183184
184- mean_ = mean(x, dim, mask = mask)
185185 select case(dim)
186186 case(1)
187- do i = 1, size(x, 1)
188- center(i, :) = merge( x(i, :) - mean_,&
187+ do i = 1, size(res, 2)
188+ do j = 1, size(res, 1)
189+ mask_ = merge(.true., .false., mask(:, i) .and. mask(:, j))
190+ centeri_ = merge( x(:, i) - mean(x(:, i), mask = mask_),&
189191 #:if t1[0] == 'r'
190192 0._${k1}$,&
191193 #:else
192194 cmplx(0,0,kind=${k1}$),&
193195 #:endif
194- mask(i, :))
195- end do
196- #:if t1[0] == 'r'
197- res = matmul( transpose(center), center)
198- #:else
199- res = matmul( transpose(conjg(center)), center)
200- #:endif
201- do j = 1, size(res, 2)
202- do i = 1, size(res, 1)
203- n = count(merge(.true., .false., mask(:, i) .and. mask(:, j)))
204- res(i, j) = res(i, j) / (n - merge(1, 0,&
196+ mask_)
197+ centerj_ = merge( x(:, j) - mean(x(:, j), mask = mask_),&
198+ #:if t1[0] == 'r'
199+ 0._${k1}$,&
200+ #:else
201+ cmplx(0,0,kind=${k1}$),&
202+ #:endif
203+ mask_)
204+
205+ n = count(mask_)
206+ res(j, i) = dot_product( centerj_, centeri_)&
207+ / (n - merge(1, 0,&
205208 optval(corrected, .true.) .and. n > 0))
206209 end do
207210 end do
208211 case(2)
209- do i = 1, size(x, 2)
210- center(:, i) = merge( x(:, i) - mean_,&
212+ do i = 1, size(res, 2)
213+ do j = 1, size(res, 1)
214+ mask_ = merge(.true., .false., mask(i, :) .and. mask(j, :))
215+ centeri_ = merge( x(i, :) - mean(x(i, :), mask = mask_),&
211216 #:if t1[0] == 'r'
212217 0._${k1}$,&
213218 #:else
214219 cmplx(0,0,kind=${k1}$),&
215220 #:endif
216- mask(:, i))
217- end do
218- #:if t1[0] == 'r'
219- res = matmul( center, transpose(center))
220- #:else
221- res = matmul( center, transpose(conjg(center)))
222- #:endif
223- do j = 1, size(res, 2)
224- do i = 1, size(res, 1)
225- n = count(merge(.true., .false., mask(i, :) .and. mask(j, :)))
226- res(i, j) = res(i, j) / (n - merge(1, 0,&
221+ mask_)
222+ centerj_ = merge( x(j, :) - mean(x(j, :), mask = mask_),&
223+ #:if t1[0] == 'r'
224+ 0._${k1}$,&
225+ #:else
226+ cmplx(0,0,kind=${k1}$),&
227+ #:endif
228+ mask_)
229+
230+ n = count(mask_)
231+ res(j, i) = dot_product( centeri_, centerj_)&
232+ / (n - merge(1, 0,&
227233 optval(corrected, .true.) .and. n > 0))
228234 end do
229235 end do
@@ -246,36 +252,38 @@ contains
246252 , merge(size(x, 1), size(x, 2), mask = 1<dim))
247253
248254 integer :: i, j, n
249- real(dp) :: mean_(merge(size(x, 1), size(x, 2), mask = 1<dim))
250- real(dp) :: center(size(x, 1),size(x, 2))
255+ real(dp) :: centeri_(merge(size(x, 2), size(x, 1), mask = 1<dim))
256+ real(dp) :: centerj_(merge(size(x, 2), size(x, 1), mask = 1<dim))
257+ logical :: mask_(merge(size(x, 2), size(x, 1), mask = 1<dim))
251258
252- mean_ = mean(x, dim, mask = mask)
253259 select case(dim)
254260 case(1)
255- do i = 1, size(x, 1)
256- center(i, :) = merge( x(i, :) - mean_,&
257- 0._dp,&
258- mask(i, :))
259- end do
260- res = matmul( transpose(center), center)
261- do j = 1, size(res, 2)
262- do i = 1, size(res, 1)
263- n = count(merge(.true., .false., mask(:, i) .and. mask(:, j)))
264- res(i, j) = res(i, j) / (n - merge(1, 0,&
261+ do i = 1, size(res, 2)
262+ do j = 1, size(res, 1)
263+ mask_ = merge(.true., .false., mask(:, i) .and. mask(:, j))
264+ centeri_ = merge( x(:, i) - mean(x(:, i), mask = mask_),&
265+ 0._dp, mask_)
266+ centerj_ = merge( x(:, j) - mean(x(:, j), mask = mask_),&
267+ 0._dp, mask_)
268+
269+ n = count(mask_)
270+ res(j, i) = dot_product( centerj_, centeri_)&
271+ / (n - merge(1, 0,&
265272 optval(corrected, .true.) .and. n > 0))
266273 end do
267274 end do
268275 case(2)
269- do i = 1, size(x, 2)
270- center(:, i) = merge( x(:, i) - mean_,&
271- 0._dp,&
272- mask(:, i))
273- end do
274- res = matmul( center, transpose(center))
275- do j = 1, size(res, 2)
276- do i = 1, size(res, 1)
277- n = count(merge(.true., .false., mask(i, :) .and. mask(j, :)))
278- res(i, j) = res(i, j) / (n - merge(1, 0,&
276+ do i = 1, size(res, 2)
277+ do j = 1, size(res, 1)
278+ mask_ = merge(.true., .false., mask(i, :) .and. mask(j, :))
279+ centeri_ = merge( x(i, :) - mean(x(i, :), mask = mask_),&
280+ 0._dp, mask_)
281+ centerj_ = merge( x(j, :) - mean(x(j, :), mask = mask_),&
282+ 0._dp, mask_)
283+
284+ n = count(mask_)
285+ res(j, i) = dot_product( centeri_, centerj_)&
286+ / (n - merge(1, 0,&
279287 optval(corrected, .true.) .and. n > 0))
280288 end do
281289 end do
0 commit comments