fortran中的2D数组连接

时间:2015-06-19 00:59:36

标签: 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,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级。

3 个答案:

答案 0 :(得分:3)

2003年fortran中的数组连接并不像您想象的那样有效。连接时,它不会并排堆叠两个数组。它将逐个从第一个数组中选取元素并放入一维数组中。然后它将对第二个数组执行相同的操作,但它会将其附加到第一个数组的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 :(得分:0)

另一种方式可能只是

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

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

答案 2 :(得分:-1)

使用1-D阵列填充它然后重塑你的mat3。