我有一个N维数组,每个维度中都有相同数量的项(即每个维度具有相同的“长度”)。
给定一个对数组的一维索引,我想要一个函数,该函数返回与该索引相关联的坐标。实际上,数组的索引方式并不重要(在算法操作该数组时,所有维度都是相等的,没有任何优先级)。
因此,例如,如果我有一个4x4x4的数组,索引63应返回[3,3,3],索引0应返回[0,0,0],索引5应返回[1,1,0]。
我编写了以下函数,其中nDim是维数,nBin是每个维度的长度:
似乎这个计算是有效的 - 但是否有更高效的方法来进行计算呢?说实话,我提出了这个问题只是为了分享这个解决方案,因为我在网上找不到解决方案。但如果有更有效的方法,那就太好了 - 请分享!
上面的函数是用python编写的,但我只是用它来原型化一个C(实际上是CUDA)函数,所以我无法使用Python的精彩库。
以下是将JackOLantern和Eric关于下面两个幂次大小的评论结合起来的解决方案。对于我尝试过的少数测试用例,它似乎可行。
给定一个对数组的一维索引,我想要一个函数,该函数返回与该索引相关联的坐标。实际上,数组的索引方式并不重要(在算法操作该数组时,所有维度都是相等的,没有任何优先级)。
因此,例如,如果我有一个4x4x4的数组,索引63应返回[3,3,3],索引0应返回[0,0,0],索引5应返回[1,1,0]。
我编写了以下函数,其中nDim是维数,nBin是每个维度的长度:
def indicesOf(x,nDim,nBin) :
indices = []
for i in arange(0,nDim) :
index = (x/nBin**(i))%nBin
indices.append(index)
x -= index*nBin**i
return indices
似乎这个计算是有效的 - 但是否有更高效的方法来进行计算呢?说实话,我提出了这个问题只是为了分享这个解决方案,因为我在网上找不到解决方案。但如果有更有效的方法,那就太好了 - 请分享!
上面的函数是用python编写的,但我只是用它来原型化一个C(实际上是CUDA)函数,所以我无法使用Python的精彩库。
以下是将JackOLantern和Eric关于下面两个幂次大小的评论结合起来的解决方案。对于我尝试过的少数测试用例,它似乎可行。
def indicesPowOf2(x,nDim,nBin) :
logWidth = math.log(nBin,2)
indices = [0]*nDim
for i in arange(nDim) :
indices[i] = x & (nBin-1)
x = x >> int(logWidth)
return indices
nBin
是2的幂,则foo%nBin == foo&(nBin-1)
。 - Vitality