在我的Fortran 90代码中,我创建了以下数组(称为数组)的整数:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
我希望提取第一列,并将其保存在名为 time 的四元素向量中。我有以下代码:
PROGRAM test
IMPLICIT NONE
INTEGER, PARAMETER :: numrows=4, numcols=10
INTEGER :: i, j, k
INTEGER, DIMENSION(:,:), ALLOCATABLE :: array, time
ALLOCATE(array(numrows,numcols))
ALLOCATE(time(numrows))
k=1
DO i=1,numrows
DO j=1,numcols
array(i,j)=k
k=k+1
END DO
END DO
DO i=1,numrows
WRITE(*,"(100(3X,I3))") (array(i,j), j=1,numcols)
END DO
time=array(:,1)
END PROGRAM test
但是,我收到以下错误消息(在gfortran中编译时):
test.f90:8.15:
ALLOCATE(time(numrows))
1
Error: Rank mismatch in array reference at (1) (1/2)
test.f90:22.2:
time=array(:,1)
1
Error: Incompatible ranks 2 and 1 in assignment at (1)
为什么会这样?错误消息似乎表明数组array(:,1)
的等级为2,而不是等级1.是否有任何方法可以将array(:,1)
转换为等级1的数组?我是否需要使用RESHAPE
以某种方式挤压阵列?或者是使用array(:,1)
的问题,我是指定列向量而不是行向量?非常感谢你的时间。
答案 0 :(得分:4)
您正在指定名为time的排名2可分配数组:
INTEGER, DIMENSION(:,:), ALLOCATABLE :: array, time
然后尝试将其分配为rank-1数组:
ALLOCATE(time(numrows))
- 不要那样做。这完全没问题:
PROGRAM test
IMPLICIT NONE
INTEGER, PARAMETER :: numrows=4, numcols=10
INTEGER :: i, j, k
INTEGER, DIMENSION(:,:), ALLOCATABLE :: array
INTEGER, DIMENSION(:), ALLOCATABLE :: time
ALLOCATE(array(numrows,numcols))
ALLOCATE(time(numrows))
k=1
DO i=1,numrows
DO j=1,numcols
array(i,j)=k
k=k+1
END DO
END DO
DO i=1,numrows
WRITE(*,"(100(3X,I3))") (array(i,j), j=1,numcols)
END DO
time=array(:,1)
END PROGRAM test