2016-10-28 166 views
1

我想翻转我的矩阵。这样T(1,1)= C(2,1)翻转矩阵fortran

我已经做了这个程序,我发现了一个代码,应该这样做在线即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 
+1

要从头开始:您将矩阵'T'和'C'分配为3x3大小而不是2x2。 – Wildcat

回答

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 

或者,如果你真的想与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开始计数。为了安全起见,请在lboundubound内部函数的帮助下遍历数组,而不是像上面那样使用显式边界:

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

您正在分配3 x 3阵列(索引范围为0 - 2,包括0和2)。您只将数值分配给数组T的九个元素中的四个,然后将该数组的一个2 x 3切片分配给C。这是无效的,因为赋值运算符右侧的数组表达式与左侧的数组表达式不同。此外,您选择的数组元素的写法会让有关数组维度的混淆持续不断。如果您分配尺寸为0:2,0,0:2的T,然后垂直翻转,则与T(2,2)对应的结果的元素将为C(0,2)

有几种可能的方法来纠正代码。其中较有可能:

  • 如果你想继续与您现在使用的尺寸,然后翻转阵列表达会T(2:0:-1, :)

  • 如果您想要索引范围为1 - 2(含)的2 x 2阵列(与C=T(2:1:-1, :)一致),请适当分配阵列(例如allocate(T(2, 2)))。