2012-10-25 4 views
2

배열 할 수있는 큰 할당 가능한 벡터들을 어떻게 Fortran의 배열에 결합 할 수 있습니까? 어레이가 일 때 reshape을 사용하여 복사 및 재 형성을 피하고 싶습니다.Fortran : 복사 및 재 형성없이 배열에 할당 가능한 벡터를 결합

program test_equiv 
    integer x(10), y(10), z(10), xyz(10,3) 
    equivalence (x, xyz(1,1)) 
    equivalence (y, xyz(1,2)) 
    equivalence (z, xyz(1,3)) 

    x = 1 
    y = 2 
    z = 3 

! and we can use just normal array syntax 
    print *, xyz(3,:) 
end program 

이 의지하지만, 할당 가능한 배열 작동하지 : 내가 달성하고자하는 효과는 포트란의 equivalence는 설명하기 위해처럼입니다. 매트릭스의 벡터에 액세스하는 경우 포인터를 통해 쉽게 구현할 수 있습니다. 하지만 어떻게 벡터를 2 차원 배열로 결합 할 수 있습니까?

program test_arofpntrs 
implicit none 

integer :: i 
integer, allocatable, target :: xs(:), ys(:), zs(:) 

type t_p_xs 
    integer, pointer :: p_xs(:) 
end type t_p_xs 

type(t_p_xs), allocatable :: coords(:) 

allocate(coords(3), xs(10), ys(10), zs(10)) 

xs = 1 
ys = 2 
zs = 3 


coords(1) % p_xs => xs 
coords(2) % p_xs => ys 
coords(3) % p_xs => zs 

print *, coords(1) % p_xs(:) 

! this fails: 
!print *, coords(:) % p_xs(1) 


end program 

이 못생긴 하나는 XS (i)를 액세스 할 수 없습니다, YS (I), ZS (I) : 지금까지 난 단지 문제가 포인터의 배열에왔다. 사본없이 원하는 것을 할 수 있습니까?

답변

3

별도의 1D 어레이로 시작하는 경우 불가능합니다. 할당 가능한 배열은 메모리의 어느 위치 에나있을 수 있습니다. Fortran 배열이 연속적 일 필요는 없지만 몇 가지 걸음 걸이 체계가 있어야합니다.

! this fails: 
!print *, coords(:) % p_xs(1) 

은 단순히 다음 요소의 주소를 계산할 수 없으므로 Fortran 표준에 의해 금지됩니다. 1D 어레이는 동일한 길이를 보장하지 않습니다.

또한 reshape은 비효율적 일 필요는 없지만 색인 작성을 구문 적으로 도울 수는 있지만 데이터를 전혀 건드리지 마십시오.

포인터는 유용한 도구이며 여기에서 도움이 될 수 있습니다. 1D 배열 비트를 다르게 사용해야합니다. 예를 들어 긴 1D 배열을 할당하고 그 부품, 전체로서 2 차원 포인터 1D 포인터, 또는 더 다른 방식 라운드 :

real,allocatable,target :: xyz(:,:) 
real,pointer :: x(:),y(:),z(:) 


allocate(xyz(1:10,1:3)) 
x => xyz(:,1) 
y => xyz(:,2) 
z => xyz(:,3) 

인덱스 심지어 다른 순서 가능, 즉 xyz(3,10); x => xyz(1,:).

또한 당신은

long1D(1:size(xyz)) => xyz 

을 할 수 있지만,이 방향 (그렇지 않으면 2003)에서 포트란 2008 기능입니다주의 수 있습니다.

+0

이 의심스러운 점을 이해해 주시기 바랍니다. – beetleboom