2016-10-28 160 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)))。