Fortran 中的二维数组串联

2D array concatenation in fortran

Fortran 2003 具有用于数组连接的方括号语法,Intel 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

有人可以评论我哪里错了吗?这里的 rank 2 和 1 是什么?我想所有数组的等级都是 2。

fortran 2003 中的数组连接并不像您想象的那样有效。当您连接时,它不会并排堆叠两个数组。它将从第一个数组中一个一个地挑选元素并放入一个一维数组中。然后它将对第二个数组做同样的事情,但它将把它附加到第一个数组的一维形式。

以下代码有效。

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

使用一维数组填充它,然后重塑你的 mat3。

另一种方法可以是

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

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