fortran语言中的二维数组连接

fortran语言中的二维数组连接,fortran,gfortran,intel-fortran,Fortran,Gfortran,Intel Fortran,Fortran 2003具有方括号语法用于数组串联,英特尔Fortran编译器也支持它。我在这里为矩阵连接编写了一个简单的代码: program matrix implicit none real,dimension (3,3) :: mat1,mat2 real,dimension(3,6):: mat3 integer i mat1=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/)) mat2=reshape( (/1,2,3,4,5,6,7,8,9/),(/3

Fortran 2003具有方括号语法用于数组串联,英特尔Fortran编译器也支持它。我在这里为矩阵连接编写了一个简单的代码:

program matrix
implicit none
real,dimension (3,3) :: mat1,mat2
real,dimension(3,6):: mat3
integer i

mat1=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
mat2=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
mat3=[mat1,mat2]

!display
do i=1,3,1
write(*,10) mat3(i,:)
10 format(F10.4)
end do

end program
但我得到的错误是

mat3=[mat1,mat2]
Error: Incompatible ranks 2 and 1 in assignment
我希望输出为

1 2 3 1 2 3
4 5 6 4 5 6
7 8 9 7 8 9

有人能评论一下我哪里做错了吗?这里的排名2和排名1是什么?我想所有数组都有秩2。

fortran 2003中的数组串联并不像您想象的那样工作。连接时,不会将两个数组并排堆叠。它将从第一个数组中逐个拾取元素,并将其放入一维数组中。然后,它将对第二个数组执行相同的操作,但它会将其附加到第一个数组的1-D形式

下面的代码可以工作

program matrix
implicit none
real,dimension (3,3) :: mat1,mat2
real,dimension(18) :: mat3
integer i

mat1=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
mat2=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
mat3=[mat1,mat2]

print*, shape([mat1,mat2])  !check shape of concatenated array
!display
do i=1,18,1
write(*,10) mat3(i)
10 format(F10.4)
end do

end program
但是,您想要的结果可以使用以下代码实现

program matrix
implicit none
real,dimension (3,3) :: mat1,mat2
real,dimension(3,6) :: mat3
integer i

mat1=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
mat2=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))

do i=1,3
mat3(i,:)=[mat1(:,i),mat2(:,i)]
enddo

!display
do i=1,3,1
write(*,*) mat3(i,:)
end do

end program

使用1-D阵列填充,然后重塑mat3

另一种方法就是

mat3(:,1:3) = mat1
mat3(:,4:6) = mat2

我不知道哪个更快,这个循环还是上面的do循环…

你将得到所有数字的尾随零,因为你已经声明矩阵为实。我注意到您只期望整数。将数组声明为整数可以解决这个问题。Fortran 2003有方括号语法用于数组连接,我不会这么说。Fortran 2003提供了方括号,作为长期以来用于分隔数组的
(/
/)
的替代方法,如代码中
重塑
的两种用法所示。你写的方式表明你可能认为方括号是某种运算符;他们不是。