Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 用fortran语言翻转矩阵_Matrix_Fortran_Fortran90_Gfortran - Fatal编程技术网

Matrix 用fortran语言翻转矩阵

Matrix 用fortran语言翻转矩阵,matrix,fortran,fortran90,gfortran,Matrix,Fortran,Fortran90,Gfortran,我想把矩阵上下翻转。使得T(1,1)=C(2,1) 我已经做了这个程序,我在网上找到了一个应该这样做的代码,它是C=T(2:1:-1,:),但是当试图得到值C(1,1)应该是3时,我得到了1.3533635457363350E-306。如何翻转矩阵,使其向上变为向下 program main implicit none integer iMax, jMax double precision, dimension(:,:), allocatable :: T,C double pre

我想把矩阵上下翻转。使得T(1,1)=C(2,1)

我已经做了这个程序,我在网上找到了一个应该这样做的代码,它是
C=T(2:1:-1,:)
,但是当试图得到值C(1,1)应该是3时,我得到了1.3533635457363350E-306。如何翻转矩阵,使其向上变为向下

program main


implicit none
  integer iMax, jMax
  double precision, dimension(:,:), allocatable :: T,C

double precision x, dx,f,L2old,L2norm

integer i, j,n


 allocate(T(0:2, 0:2))
 allocate(C(0:2, 0:2))


T(1,1)=1
T(1,2)=2
T(2,1)=3
T(2,2)=4

write(*,*) T(2,2)

C=T(2:1:-1, :)

Write(*,*) C(1,2)


end program main

您正在分配3 x 3阵列(索引范围0-2,包括0-2)。您只将值分配给数组
T
的九个元素中的四个,然后将该数组的一个2 x 3切片分配给
C
。这是无效的,因为赋值运算符右侧的数组表达式与左侧的数组表达式具有不同的形状

此外,选择要编写的数组元素掩盖了对所涉及数组的维度的持续混淆。如果将
T
分配为维度0:2、0:2,然后垂直翻转,则与
T(2,2)
对应的结果元素将是
C(0,2)

有几种可能的方法来更正代码。更有可能的是:

  • 如果要继续使用当前使用的维度,则翻转数组的表达式应为
    T(2:0:-1,:)

  • 如果您想要索引范围为1-2(含1-2)的2 x 2数组,这与
    C=T(2:1:-1,:)
    一致,则适当地分配数组(例如
    allocate(T(2,2))


如果您分配了适当大小的矩阵,那么一切都应该按预期进行

比如说这个节目,

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

或者,如果您确实想使用3x3矩阵,那么错误就在
C=T(2:1:-1,:)
行中。它应该是
C=T(2:0:-1,:)

输出:

   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

计算数组的元素时要小心。可能很难调试,所以最好总是从0开始计数,或者总是从1开始计数。为了安全起见,请始终借助
lbound
ubound
内部函数遍历数组,而不是像上面那样使用显式边界:

  do i = lbound(t, dim=1), ubound(t, dim=1)
    write (*, *) t(i, :)
  end do

首先:将矩阵
T
C
分配为3x3大小,而不是2x2大小。
  do i = lbound(t, dim=1), ubound(t, dim=1)
    write (*, *) t(i, :)
  end do