将一维“平坦”索引变换为N维阵列的N维矢量索引

时间:2013-09-21 12:01:37

标签: c++ c arrays cuda indexing

我有一个N维数组,每个维度的项目数相同(即“长度”相同)。

给定数组的一维索引,我想要一个返回与该索引相关的坐标的函数。数组索引的方式实际上并不重要(从某种意义上说,数组的所有维度都是相同的,没有一个在将在数组上运行的算法优先)。

所以,例如,如果我有一个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)函数的原型,因此我没有可用的pythons精彩库。

这是一个结合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

1 个答案:

答案 0 :(得分:2)

您可以避免使用**(幂运算符)来降低计算成本,尤其是在需要将此代码添加到CUDA内核时。

以下方式可能更有效

void indices(int x, int nDim, int nBin, int indices[]) {
    for(int i=0;i<nDim;i++) {
        indices[i] = x % nBin;
        x /= nBin;
    }
}

如果您的nBin是2的幂,则可以使用>>&来替换/%