120 MODULE PROCEDURE nndv_sp, nndv_dp
219 MODULE PROCEDURE pd_sp, pd_dp
226 FUNCTION nndv_sp(mat1, mat2, mask, valid)
230 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: mat1, mat2
231 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
232 LOGICAL,
OPTIONAL,
INTENT(OUT) :: valid
235 INTEGER(i4) :: iCo, iRo
236 INTEGER(i4) :: noValidPixels
237 INTEGER(i4),
DIMENSION(size(shape(mat1))) :: shapemask
238 INTEGER(i4),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
239 REAL(sp),
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
240 REAL(sp),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: NNDVMatrix
241 LOGICAL,
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
242 LOGICAL,
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
245 if (
present(mask))
then
246 shapemask = shape(mask)
248 shapemask = shape(mat1)
251 if (any(shape(mat1) .NE. shape(mat2))) &
252 stop
'NNDV_sp: shapes of input matrix 1 and input matrix 2 are not matching'
253 if (any(shape(mat1) .NE. shapemask)) &
254 stop
'NNDV_sp: shapes of input matrices and mask are not matching'
263 if (
present(mask))
then
264 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = mask
266 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = .true.
270 bufferedmat1 = 0.0_sp
271 bufferedmat2 = 0.0_sp
272 bufferedmat1(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat1
273 bufferedmat2(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat2
279 do ico = 2_i4,
size(bufferedmat1, dim = 2) - 1
280 do iro = 2_i4,
size(bufferedmat1, dim = 1) - 1
281 if (.NOT. maske(iro, ico)) cycle
282 nndvmatrix(iro - 1_i4, ico - 1_i4) = &
283 real(abs(count((bufferedMat1(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) &
284 - bufferedMat1(iRo, iCo) > epsilon(0.0_sp)) .AND. &
285 (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) - &
286 count((bufferedMat2(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) &
287 - bufferedMat2(iRo, iCo) > epsilon(0.0_sp)) .AND. &
288 (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) &
292 validcount(iro - 1_i4, ico - 1_i4) = count(maske(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4)) - 1_i4
297 validmaske = (maske(2 :
size(maske, dim = 1) - 1_i4, 2 :
size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
298 novalidpixels = count(validmaske)
299 if (novalidpixels .GT. 0_i4)
then
300 nndvmatrix = merge(nndvmatrix / real(validcount, sp), nndvmatrix, validmaske)
302 nndv_sp = 1.0_sp - sum(nndvmatrix, mask = validmaske) / novalidpixels
303 if (
present(valid)) valid = .true.
307 if (
present(valid)) valid = .false.
312 FUNCTION nndv_dp(mat1, mat2, mask, valid)
316 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: mat1, mat2
317 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
318 LOGICAL,
OPTIONAL,
INTENT(OUT) :: valid
321 INTEGER(i4) :: iCo, iRo
322 INTEGER(i4) :: noValidPixels
323 INTEGER(i4),
DIMENSION(size(shape(mat1))) :: shapemask
324 INTEGER(i4),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
325 REAL(dp),
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
326 REAL(dp),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: NNDVMatrix
327 LOGICAL,
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
328 LOGICAL,
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
331 if (
present(mask))
then
332 shapemask = shape(mask)
334 shapemask = shape(mat1)
337 if (any(shape(mat1) .NE. shape(mat2))) &
338 stop
'NNDV_dp: shapes of input matrix 1 and input matrix 2 are not matching'
339 if (any(shape(mat1) .NE. shapemask)) &
340 stop
'NNDV_dp: shapes of input matrices and mask are not matching'
349 if (
present(mask))
then
350 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = mask
352 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = .true.
356 bufferedmat1 = 0.0_dp
357 bufferedmat2 = 0.0_dp
358 bufferedmat1(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat1
359 bufferedmat2(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat2
365 do ico = 2_i4,
size(bufferedmat1, dim = 2) - 1
366 do iro = 2_i4,
size(bufferedmat1, dim = 1) - 1
367 if (.NOT. maske(iro, ico)) cycle
368 nndvmatrix(iro - 1_i4, ico - 1_i4) = &
369 real(abs(count((bufferedMat1(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) - &
370 bufferedMat1(iRo, iCo) > epsilon(0.0_dp)) .AND. &
371 (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) - &
372 count((bufferedMat2(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) - &
373 bufferedMat2(iRo, iCo) > epsilon(0.0_dp)) .AND. &
374 (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) &
378 validcount(iro - 1_i4, ico - 1_i4) = count(maske(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4)) - 1_i4
383 validmaske = (maske(2 :
size(maske, dim = 1) - 1_i4, 2 :
size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
384 novalidpixels = count(validmaske)
385 if (novalidpixels .GT. 0_i4)
then
386 nndvmatrix = merge(nndvmatrix / real(validcount, dp), nndvmatrix, validmaske)
388 nndv_dp = 1.0_dp - sum(nndvmatrix, mask = validmaske) / novalidpixels
389 if (
present(valid)) valid = .true.
393 if (
present(valid)) valid = .false.
400 FUNCTION pd_sp(mat1, mat2, mask, valid)
404 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: mat1, mat2
405 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
406 LOGICAL,
OPTIONAL,
INTENT(OUT) :: valid
409 INTEGER(i4) :: iCo, iRo
410 INTEGER(i4) :: noValidPixels
411 INTEGER(i4),
DIMENSION(size(shape(mat1))) :: shapemask
412 INTEGER(i4),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
413 REAL(sp),
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
414 REAL(sp),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: PDMatrix
415 LOGICAL,
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
416 LOGICAL,
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
418 if (
present(mask))
then
419 shapemask = shape(mask)
421 shapemask = shape(mat1)
424 if (any(shape(mat1) .NE. shape(mat2))) &
425 stop
'PD_sp: shapes of input matrix 1 and input matrix 2 are not matching'
426 if (any(shape(mat1) .NE. shapemask)) &
427 stop
'PD_sp: shapes of input matrices and mask are not matching'
436 if (
present(mask))
then
437 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = mask
439 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = .true.
443 bufferedmat1 = 0.0_sp
444 bufferedmat2 = 0.0_sp
445 bufferedmat1(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat1
446 bufferedmat2(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat2
450 do ico = 2_i4,
size(bufferedmat1, dim = 2) - 1_i4
451 do iro = 2_i4,
size(bufferedmat1, dim = 1) - 1_i4
453 if (.NOT. maske(iro, ico)) cycle
456 pdmatrix(iro - 1_i4, ico - 1_i4) = &
459 (bufferedmat1(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4) - &
460 bufferedmat1(iro, ico) > epsilon(0.0_sp)) .NEQV. &
462 (bufferedmat2(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4) - &
463 bufferedmat2(iro, ico) > epsilon(0.0_sp)) &
466 .and. (maske(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4)) &
470 validcount(iro - 1_i4, ico - 1_i4) = count(maske(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4)) - 1_i4
476 validmaske = (maske(2 :
size(maske, dim = 1) - 1_i4, 2 :
size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
477 novalidpixels = count(validmaske)
478 if (novalidpixels .GT. 0_i4)
then
479 pdmatrix = merge(pdmatrix / real(validcount, sp), pdmatrix, validmaske)
481 pd_sp = 1.0_sp - sum(pdmatrix, mask = validmaske) / novalidpixels
482 if (
present(valid)) valid = .true.
486 if (
present(valid)) valid = .false.
491 FUNCTION pd_dp(mat1, mat2, mask, valid)
495 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: mat1, mat2
496 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
497 LOGICAL,
OPTIONAL,
INTENT(OUT) :: valid
500 INTEGER(i4) :: iCo, iRo
501 INTEGER(i4) :: noValidPixels
502 INTEGER(i4),
DIMENSION(size(shape(mat1))) :: shapemask
503 INTEGER(i4),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
504 REAL(dp),
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
505 REAL(dp),
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: PDMatrix
506 LOGICAL,
DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
507 LOGICAL,
DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
509 if (
present(mask))
then
510 shapemask = shape(mask)
512 shapemask = shape(mat1)
515 if (any(shape(mat1) .NE. shape(mat2))) &
516 stop
'PD_dp: shapes of input matrix 1 and input matrix 2 are not matching'
517 if (any(shape(mat1) .NE. shapemask)) &
518 stop
'PD_dp: shapes of input matrices and mask are not matching'
527 if (
present(mask))
then
528 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = mask
530 maske(2 : (
size(maske, dim = 1) - 1_i4), 2 : (
size(maske, dim = 2) - 1_i4)) = .true.
534 bufferedmat1 = 0.0_dp
535 bufferedmat2 = 0.0_dp
536 bufferedmat1(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat1
537 bufferedmat2(2 : (
size(maske, dim = 1) - 1), 2 : (
size(maske, dim = 2) - 1)) = mat2
541 do ico = 2_i4,
size(bufferedmat1, dim = 2) - 1_i4
542 do iro = 2_i4,
size(bufferedmat1, dim = 1) - 1_i4
544 if (.NOT. maske(iro, ico)) cycle
547 pdmatrix(iro - 1_i4, ico - 1_i4) = &
550 (bufferedmat1(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4) - &
551 bufferedmat1(iro, ico) > epsilon(0.0_dp)) .NEQV. &
553 (bufferedmat2(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4) - &
554 bufferedmat2(iro, ico) > epsilon(0.0_dp)) &
557 .and. (maske(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4)) &
561 validcount(iro - 1_i4, ico - 1_i4) = count(maske(iro - 1_i4 : iro + 1_i4, ico - 1_i4 : ico + 1_i4)) - 1_i4
567 validmaske = (maske(2 :
size(maske, dim = 1) - 1_i4, 2 :
size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
568 novalidpixels = count(validmaske)
569 if (novalidpixels .GT. 0_i4)
then
570 pdmatrix = merge(pdmatrix / real(validcount, dp), pdmatrix, validmaske)
572 pd_dp = 1.0_dp - sum(pdmatrix, mask = validmaske) / novalidpixels
573 if (
present(valid)) valid = .true.
577 if (
present(valid)) valid = .false.
Calculates the number of neighboring dominating values, a measure for spatial dissimilarity.
Calculates pattern dissimilarity (PD) measure.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
Routines for bias insensitive comparison of spatial patterns.