2016-10-28 3 views
1

내 행렬을 뒤집어 놓고 싶습니다. T (1,1) = C (2,1)행렬을 뒤집기

나는이 프로그램을 만들었고 온라인에서 그 코드가 C=T(2:1:-1, :) 인 것을 발견했다. 그러나 값 C , 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'를 2x2가 아닌 3x3 크기로 할당하십시오. – 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 포함)을 할당하고 있습니다. 배열 T의 9 개 요소 중 4 개에만 값을 할당 한 다음 해당 배열의 2 x 3 슬라이스를 C에 할당합니다. 할당 연산자의 오른쪽에있는 배열 표현식이 왼쪽에있는 것과 다른 모양을 가지므로 유효하지 않습니다.

또한 배열 요소를 선택하면 작성한 배열의 크기에 대한 혼란이 계속됩니다. 크기가 0 : 2, 0 : 2 인 T을 할당 한 다음 수직으로 뒤집 으면 T(2,2)에 해당하는 결과의 요소는 C(0,2)이됩니다.

코드를 수정할 수있는 방법은 여러 가지가 있습니다. 더 많은 가능성 중 :

  • 당신이 지금 사용하고있는 치수를 계속하려면, 다음 뒤집어 배열에 대한 표현은 T(2:0:-1, :)이 될 것입니다.

  • C=T(2:1:-1, :)과 일치하는 색인 ​​범위가 1 - 2 인 2 x 2 배열을 원한다면 배열을 적절하게 할당하십시오 (예 : allocate(T(2, 2))).