0

我需要一些帮助来动态分配数组。

我有一个数组,其大小在每一步都不断变化 - 我从一个行向量开始,并在循环的每一步添加另一个行向量。我需要使用这个新数组进行进一步计算。

我一直在尝试将数组声明为可分配的,然后在 do-loop 中分配它们,但我无法让它正常工作。

当您为该特定数组取消分配内存时,我仍然不太清楚会发生什么。如果数据丢失,那么在释放之前存储它,我是否使用另一个数组?如何指定该数组的大小?

任何帮助将不胜感激。

! Program to generate a matrix whose rows are linearly independent vectors. 
! The elements of the matrix are either 1 or -1

   program trial

   implicit none 
   integer, parameter ::n=10,p=5   !where 'p' gives the no. of rows, & 'n' gives the no. of columns
   real(kind=8),dimension(p,n) ::z1 
! The array to be generated - this needs to be made allocatable
! I'll need the values of this array for further calculations, so should I store
! them in another array?

   integer::i,j,k,s1  !counters used
   real(kind=8),dimension(n)::x

   do i=1,p
15  call random_number(x) !generate random row vectors 
    z1(i,:)=x

! To make the array elements 1's and -1's
    do j=1,n
        if (z1(i,j).ge.0.5) then
            z1(i,j)=1.d0
!           write(*,*),z1(i,j)
        else
            z1(i,j)=-1.d0
!           write(*,*),z1(i,j)
        endif
    enddo

! Checking the output so far
    print*,'Z1'
    do k=1,i
        write(*,*)(z1(k,j),j=1,n)
    enddo

! To ckeck for linear independence, get the reduced row echelon form. Check the rows
! of the rref array, if any of the rows contains only zeros, the vectors are not
! linearly independent. Hence, regenerate that particular row of the array. 

! Check for linear independence as each row is added

    call to_rref(z1)
        do k=1,i
            s1=0
            do j=1,n
            if(z1(k,j)==0)then
                s1=s1+1
            endif
            if (s1==n) then
                print *,'THE VECTORS ARE NOT LINEARLY INDEPENDENT'
            goto 15
            endif
            enddo
        enddo

    do k=1,i
        write(*,*)(z1(k,j),j=1,n)
    enddo
   enddo

   end

! Subroutine for getting the reduced row echelon form 
subroutine to_rref(matrix)
    implicit none
    real, dimension(:,:), intent(inout) :: matrix

    integer :: pivot, norow, nocolumn
    integer :: r, i
    real, dimension(:), allocatable :: trow

    pivot = 1
    norow = size(matrix, 1)
    nocolumn = size(matrix, 2)

    allocate(trow(nocolumn))

    do r = 1, norow
       if ( nocolumn <= pivot ) exit
       i = r
       do while ( matrix(i, pivot) == 0 )
          i = i + 1
          if ( norow == i ) then
             i = r
             pivot = pivot + 1
             if ( nocolumn == pivot ) return
          end if
       end do
       trow = matrix(i, :)
       matrix(i, :) = matrix(r, :)
       matrix(r, :) = trow
       matrix(r, :) = matrix(r, :) / matrix(r, pivot)
       do i = 1, norow
          if ( i /= r ) matrix(i, :) = matrix(i, :) - matrix(r, :) * matrix(i, pivot) 
       end do
       pivot = pivot + 1
    end do
    deallocate(trow)
  end subroutine to_rref
4

1 回答 1

2

是的,当您释放内存时,您必须将其视为不复存在。在 Fortran 95 和更早版本中,如果您希望扩展一个数组,您必须将数据复制到另一个数组,取消分配数组,重新分配并将部分复制回来。Fortran 2003 提供了一个简化过程的内在过程:move_alloc。

于 2012-09-19T01:38:54.363 回答