我有一个三维数组,我正在寻求移位,乘以(元素方式)与未移位数组,并求和所有产品。对于定义移位(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个元素数组作为可能的移位参数。
答案 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会很难。通常,没有针对这些类型问题的循环的矢量化解决方案需要创建中间数组 - 在这种情况下,需要vecx
和vecy
的所有可能移位,这将是一个非常大的中间数组。我的建议是在C中实现并从IDL调用,但也许我错过了一些东西。