2017-11-02 2 views
0

필자는 3 차원 배열을 가지고 있는데, 나는 이동하지 않고 배열로 곱하고 (요소 현명한) 모든 제품을 더한다. 쉬프트 (i, j, k)를 정의하는 3 개의 정수들의 주어진 세트에 대해,이 트리플에 대응하는 합은 상기 위치 (i, j, k)에서 다른 3 차원 어레이에 저장 될 것이다.IDL : 루프를 사용하지 않고 가능한 모든 shift 값을 어떻게 루프합니까?

가능한 모든 i, j, k 값에 대해이 작업을 시도하고 있습니다. for/while 루프를 명시 적으로 사용하지 않고이 작업을 수행 할 수 있습니까? 나는 계산 시간을 최소화하지만, IDL 나던 내가 제공하고 현재의 지침을 이해하는데 매우 관심이 :

FUNCTION ccs, vecx, vecy 

TIC 

l = 512 
km = l/2 
corvec = fltarr(km,km,km) 
N = float(l)^3 


corvec[*,*,*] = (total(vecx*shift(vecx,*,*,*))/N)+ (total(vecy*shift(vecy,*,*,*))/N) 

return, corvec 

TOC 
end 

IDL에만 가능 이동 인수로 스칼라 또는 1 개 요소의 배열을 받아 나타납니다.

답변

0

다음은 수행하려는 작업입니다. 그것은 빠르지 않지만 더 빠른 해결책을 시험 할 무언가를 줄 것입니다.

function ccs, vecx, vecy 
    compile_opt strictarr 

    tic 

    l = 512 
    km = l/2 
    corvec = fltarr(km, km, km) 
    n = float(l)^3 


    for i = 0L, km - 1L do begin 
    for j = 0L, km - 1L do begin 
     for k = 0L, km - 1L do begin 
     corvec[i, j, k] = total(vecx * shift(vecx, i, j, k))/n + total(vecy * shift(vecy, i, j, k))/n 
     endfor 
    endfor 
    endfor 

    toc 

    return, corvec 
end 

이것이 당신이하려는 일이라면, 나는 그것이 IDL에 어려울 것이라고 생각합니다. 일반적으로 이러한 유형의 문제에 대한 루프가없는 벡터화 된 솔루션은 중급 배열을 생성해야합니다.이 경우 가능한 모든 교대는 vecxvecy이며 매우 큰 중간 배열입니다. 내 제안은 C로 구현하고 IDL에서 호출하는 것이지만 어쩌면 내가 누락되었습니다.

+0

그게 내가하고 싶지 않았지만 불행히도해야만합니다. 저의 연구 고문은 IDL에서 새로운 방법을 배우는 데 도움이되도록 IDL에서 가장 빠른 방법을 찾아야한다고 말했습니다. 나는 C 나 포트란에서 무차별 대다수를 쉽게 꺼낼 수 있었지만하지 말라고했다. –

관련 문제