Matrix Sevick算法的矩阵文件约简

Matrix Sevick算法的矩阵文件约简,matrix,fortran90,Matrix,Fortran90,我的代码不允许我为某些条目分配矩阵,也就是说,我的程序运行,但当我获取某些值时,它会导致分段错误。此程序删除方形矩阵的列,将其从5x5减少到5x1 program mcluster real, dimension(:,:),pointer :: m,u real, dimension(5) :: s logical::logi integer:: n,n3 n = 5 allocate(m(n,n)) m(1,1) = 1.0 m(1,2) = 0.0 m(1,3) = 0.0 m(1

我的代码不允许我为某些条目分配矩阵,也就是说,我的程序运行,但当我获取某些值时,它会导致分段错误。此程序删除方形矩阵的列,将其从5x5减少到5x1

program mcluster

real, dimension(:,:),pointer :: m,u
real, dimension(5) :: s
logical::logi
integer:: n,n3

n = 5
allocate(m(n,n))  

m(1,1) = 1.0
m(1,2) = 0.0
m(1,3) = 0.0
m(1,4) = 0.0
m(1,5) = 1.0
m(2,1) = 0.0
m(2,2) = 1.0
m(2,3) = 1.0
m(2,4) = 0.0
m(2,5) = 0.0
m(3,1) = 0.0
m(3,2) = 1.0
m(3,3) = 1.0
m(3,4) = 0.0
m(3,5) = 1.0
m(4,1) = 0.0
m(4,2) = 0.0
m(4,3) = 0.0
m(4,4) = 1.0
m(4,5) = 0.0
m(5,1) = 1.0
m(5,2) = 0.0
m(5,3) = 1.0
m(5,4) = 0.0
m(5,5) = 1.0

nbandera1 = 1
nbandera = 0

do i = 1,n
  print*, m(i,1:n)
end do

n2 = n
jo = 6
k = 1

2   continue

do i = 1,n

    if (nbandera1 .eq. 0) then
        go to 5
    end if

    jo = jo - 1

5   continue

    do j = 2,jo 

        if (m(i,k) .eq. 1 .and. m(i,j) .eq. 1) then 
            nbandera1=1
            j1=j

            do l = 1, n 
                n1 = n - 1
                if (m(l,k) .eq. 0 .and. m(l,j1) .eq. 1) then
                    m(l,k) = m(l,j1)
                end if
            end do

            print*,'jo', jo
            do im = 1,n
                print*, m(im,1:jo)
            end do

            n3 = jo - 1
            print*,'n,n3', n,n3
            allocate(u(n,n3))

            do ii = 1,n
                j2 = 0
                do jj = 1,n
                    if (jj .ne. j1) then  
                        j2 = j2 + 1
                        u(ii,j2) = m(ii,jj)
                    end if
                end do
            end do

            do ii = 1,n
                print*, u(ii,1:n3)
            end do

            deallocate(m)
            allocate(m(n,n3))

14  continue

            do iii = 1,n
                !print*, 'shit'
                do jjj = 1,n3
                    m(iii,jjj) = u(iii,jjj) 
                end do
            end do

            do ii = 1,n
                print*, m(ii,1:n3)
            end do


            do ip = 1,n
                suma = 0
                do jp = 1,n3
                    suma = suma + m(ip,jp)
                end do
                s(ip) = suma
            end do

            k1 = 0
            do ik = 1,n-1
                if (s(ik) .ne. s(ik+1) .and. s(ik) .eq. 1.0) then
                    go to 10
                end if
                k1 = k1 +1
                if (ki .eq. n-1) then
                    stop
                end if
            end do

10  continue

            deallocate(u)
            go to 2

        else 
            nbandera1 = 0
            if (j .eq. jo) then
                nbandera = 1
                go to 3              
            end if
        end if

    end do

3   continue

    if (nbandera .eq. 1) then
        go to 4
    end if

    go to 1

4   continue

end do    

1   continue

go to 2

do i = 1,n
    print*, m(i,1:n)
end do

end program mcluster

这是专栏,谢谢。我会说得更清楚。这个程序采用由0和1组成的矩阵。明确表示为5x5的矩阵。目标是将该矩阵减少为5x1矩阵之一。(减少列数),此过程用于对粒子簇进行计数。我的算法显然运行良好,直到将矩阵减少到5x2中的一个,但是在下一个过去,也就是说,它不允许我分配一个m(5,2)的矩阵,而不是创建这个矩阵的维数,例如,让我分配m(5,3)中的一个,而不是m(5,2)中的一个。我对此感到困惑。非常感谢。我无法入睡,我观察到我的程序,在一些“转到”方面没有问题,正如我所想的,问题是,它无法将相应的值分配给指针m(n,n),我不知道为什么会发生这种情况。