2016-08-04 6 views
1

포트란에서 확장 배열을 에뮬레이션하는 기존 방법이 있습니까? C++의 벡터와 같습니다. 나는 인터넷에서이 주제에 관해서 아무 것도 발견하지 못했을 때 매우 놀랐다.값을 추가 할 때 Fortran 배열이 자동으로 증가합니다.

예를 들어, 몇 가지 되풀이 관계를 계산하고 내가 얻은 모든 중간 값을 저장한다고 가정합니다. 내 정지 기준은 인접 결과 간의 차이이므로 사전에 얼마나 많은 메모리를 할당해야하는지 미리 알 수 없습니다.

+0

관련되거나 중복 될 수 있습니까? http://stackoverflow.com/questions/8384406/how-to-increase-array-size-on-the-fly-in-fortran – solalito

+0

위 참조 게시물의 답변을 인용하십시오. "한 번에 하나의 요소 추가 배열을 성장시키는 것은 효율적인 접근법이 아닙니다 .N 요소에서 N + 1까지의 배열을 Fortran에서 확장하려면 새로운 배열을 만들고 기존 요소를 모두 복사해야합니다. 더 적절한 데이터 구조는 링크 된 목록 일 수 있습니다. " – solalito

+0

[tag : fortran90]으로 태그되었습니다. 지난 25 년간 언어 변경 사항을 정말로 무시해야합니까? 예를 들어, 아주 간단한'a = [a, 5]'는 F90이 아닙니다. (또는 효율적입니다.) – francescalus

답변

5

이전에이 사이트의 어딘가에 표시되어 있지만 확신 할 수 없습니다. francescalus에 의해 주석으로

먼저, 포트란 2003 년, 당신은 간단한

a = [a, item] 

에 의해 하나 개의 요소를 추가 할 수 있습니다. 이것은 배열을 자주 다시 할당 할 가능성이 있으며 느려질 것입니다.

배열의 크기를 배열의 너비보다 약간 크게 할당 한 다음 요소 수 n을 유지할 수 있습니다. 요소 수 n이 배열 size(a)의 크기보다 커지면 새로운 요소를 더 큰 요소 (여기서는 2x)로 할당하고 거기에 이전 요소를 복사 할 수 있습니다. 아쉽게도 포트란에는 realloc()이 없습니다.

module growing_array 
    implicit none 

    real, allocatable :: a(:) 

    integer :: n 

contains 

    subroutine add_item(item) 
    real, allocatable :: tmp(:) 
    real, intent(in) :: item 

    if (n == size(a)) then 
     !this statement is F2003, it can be avoided, but I don't see why in 2016 
     call move_alloc(a, tmp) 

     allocate(a(n*2)) 
     a(1:n) = tmp 
    end if 

    n = n + 1 

    a(n) = item 
    end subroutine 
end module 

초기 할당을 생략 했으므로 간단합니다.

모두 타입 - 바인드 된 프로 시저로 파생 된 유형으로 넣을 수 있고 데이터 구조로 사용할 수 있지만 순수한 Fortran 2003이고 원하는 것은 90입니다. 따라서 Fortran 90에 결함이 있기 때문에 Fortran 95를 보여줍니다. 할당 할 수있는 배열을위한 여러 가지 방법은 필사적으로 쓸모없고 본질적으로 죽어 있습니다.

+1

감사합니다. Fortran에 이미 구현되어 있기를 바래서 바퀴의 재발생을 피할 수 있었으면 좋겠지 만 Fortran을 많이 사용할수록 더 많이 깨달았습니다. 포트란은 네 인생을 더 편하게하는 걸 좋아하지 않는다. – DartLenin

+1

FWIW 참조 된 C++ 벡터 형식은 비슷한 방식으로 한 번에 블록을 할당합니다. 알고리즘이 무엇인지 정확하게 조사해 보는 것이 좋습니다. – agentp

+0

@HighPerformanceMark 불행히도, 내 결정을 내릴 수 없습니다. 보다 공정한 비교를 해보 죠. C++은 표준 라이브러리에서 다양한 기능과 데이터 구조를 가지고있어 많은 작업에서 fortran보다 성능이 우수합니다.Fortran은 동일한 표준 라이브러리를 가질 수 있지만 아무도 그것을 아직 쓴 적이 없기 때문에 fortran이 여러분의 삶을 편하게하기를 좋아하지 않는다고 말한 이유는 무엇입니까? – DartLenin