IDL:如何在不使用循环的情况下遍历所有可能的shift值?

时间:2017-11-02 02:17:27

标签: performance slice shift idl-programming-language

我有一个三维数组,我正在寻求移位,乘以(元素方式)与未移位数组,并求和所有产品。对于定义移位(i,j,k)的三个整数的给定集合,对应于该三元组的和将存储在所述位置(i,j,k)处的另一个3维数组中。

我试图为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个元素数组作为可能的移位参数。

1 个答案:

答案 0 :(得分: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调用,但也许我错过了一些东西。