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级。
答案 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。