如果您分配正确大小的矩阵,那么一切都应按预期工作。
例如,这个程序
program main
implicit none
double precision, dimension(:, :), allocatable :: t, c
integer :: i
allocate (t(1:2, 1:2))
allocate (c(1:2, 1:2))
t = reshape([1, 3, 2, 4], shape(t))
do i = 1, 2
write (*, *) t(i, :)
end do
write (*, *) ""
c = t(2:1:-1, :)
do i = 1, 2
write (*, *) c(i, :)
end do
end program main
产生以下输出
1.0000000000000000 2.0000000000000000
3.0000000000000000 4.0000000000000000
3.0000000000000000 4.0000000000000000
1.0000000000000000 2.0000000000000000
或者,如果你真的想与3×3矩阵来工作,那么这个错误是在该行C=T(2:1:-1, :)
。它应该是C=T(2:0:-1, :)
。
program main
implicit none
double precision, dimension(:, :), allocatable :: t, c
integer :: i
allocate (t(0:2, 0:2))
allocate (c(0:2, 0:2))
t = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], shape(t))
do i = 0, 2
write (*, *) t(i, :)
end do
write (*, *) ""
c = t(2:0:-1, :)
do i = 0, 2
write (*, *) c(i, :)
end do
end program main
输出:
1.0000000000000000 2.0000000000000000 3.0000000000000000
4.0000000000000000 5.0000000000000000 6.0000000000000000
7.0000000000000000 8.0000000000000000 9.0000000000000000
7.0000000000000000 8.0000000000000000 9.0000000000000000
4.0000000000000000 5.0000000000000000 6.0000000000000000
1.0000000000000000 2.0000000000000000 3.0000000000000000
小心与阵列的计数元件。 Off-by-one errors可能很难调试,因此总是从0开始计数或总是从1开始计数。为了安全起见,请在lbound
和ubound
内部函数的帮助下遍历数组,而不是像上面那样使用显式边界:
do i = lbound(t, dim=1), ubound(t, dim=1)
write (*, *) t(i, :)
end do
要从头开始:您将矩阵'T'和'C'分配为3x3大小而不是2x2。 – Wildcat