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 循环...
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 循环...