我需要一些帮助来动态分配数组。
我有一个数组,其大小在每一步都不断变化 - 我从一个行向量开始,并在循环的每一步添加另一个行向量。我需要使用这个新数组进行进一步计算。
我一直在尝试将数组声明为可分配的,然后在 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