calculate_distance_matrix Subroutine

public subroutine calculate_distance_matrix(coordinates, distance_matrix, grid_type, toroidal)

Subroutine to calculate the distance between the units inside a kohonen layer

Type Bound

self_organizing_map

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(inout), dimension(:,:) :: coordinates

Real array with the coordinates

real(kind=wp), intent(inout), dimension(:,:) :: distance_matrix

Real array with the distance_matrix

character(len=*) :: grid_type

Character variable with the grid type

logical :: toroidal

Logical variable for toroidal grid


Called by

proc~~calculate_distance_matrix~~CalledByGraph proc~calculate_distance_matrix self_organizing_map%calculate_distance_matrix proc~create_som self_organizing_map%create_som proc~create_som->proc~calculate_distance_matrix proc~read_som self_organizing_map%read_som proc~read_som->proc~calculate_distance_matrix proc~external_predict_map self_organizing_map%external_predict_map proc~external_predict_map->proc~create_som proc~train_som train_som proc~train_som->proc~create_som

Variables

Type Visibility Attributes Name Initial
integer, public :: i
integer, public :: j
real(kind=wp), public :: maxdiffx
real(kind=wp), public :: maxdiffy
real(kind=wp), public :: maxdiffz
real(kind=wp), public, dimension(3) :: diffs

Source Code

    subroutine calculate_distance_matrix(coordinates,distance_matrix,grid_type,toroidal)
!========================================================================================
!! Subroutine to calculate the distance between the units inside a kohonen layer 
        real(kind=wp),dimension(:,:),intent(inout) :: coordinates
!! Real array with the coordinates
        real(kind=wp),dimension(:,:),intent(inout) :: distance_matrix
!! Real array with the distance_matrix
        character(len=*) :: grid_type
!! Character variable with the grid type
        logical :: toroidal
!! Logical variable for toroidal grid
        integer :: i,j
        real(kind=wp) :: maxdiffx,maxdiffy,maxdiffz
        real(kind=wp),dimension(3) :: diffs
!
        maxdiffx=maxval(coordinates(:,1))/2.0_wp;
        maxdiffy=maxval(coordinates(:,2))/2.0_wp;
        maxdiffz=maxval(coordinates(:,3))/2.0_wp;
!
        distance_matrix=0.0d0;
!
        if(toroidal) then
            do i=1,size(distance_matrix,1);
                do j=i+1,size(distance_matrix,2);
                    diffs=dabs(coordinates(j,1:3) - coordinates(i,1:3));
                    if (diffs(1) > maxdiffx) diffs(1)=2.0_wp*maxdiffx - diffs(1);
                    if (diffs(2) > maxdiffy) diffs(2)=2.0_wp*maxdiffy - diffs(2);
                    !if (diffs(3) > maxdiffy) diffs(3)=2*maxdiffz - diffs(3);
                    if (trim(grid_type) == 'hexagonal') then
                        distance_matrix(i,j)=sum(diffs**2);
                    elseif(trim(grid_type) == 'rectangular') then!rectangular
                       distance_matrix(i,j)=maxval(diffs);
                    endif
                    !write(*,*) 'd= ',i,j,diffs(1:3),trim(grid_type)!distance_matrix(i,j)
                enddo
            enddo
        else
            do i=1,size(distance_matrix,1);
                do j=i+1,size(distance_matrix,2);
                   diffs=dabs(coordinates(j,1:3) - coordinates(i,1:3));
                   distance_matrix(i,j)=dsqrt(sum(diffs**2));
                enddo
            enddo
        endif
      !
        distance_matrix=distance_matrix + transpose(distance_matrix);
!
    end subroutine calculate_distance_matrix