-1

如何通过指针访问三维数组?目前我有这段代码,试图得到相同的结果。我需要通过指针访问才能使用 OpenCL 中数组中的值。

for (l = 0; l < NumberOfLayers - 1; l++) {
  for (i = 0; i < NeuronsPerLayer[l]; i++) {
    for (j = 0; j < NeuronsPerLayer[l + 1] - bias[l + 1]; j++) {
      cout<<Synweights[l][i][j]<<endl;  
      cout<<*(*Synweights[0]+l*NumberOfLayers + i * NeuronsPerLayer[l] + j)<<endl;
    }
  }
}

Synweights声明为:

double ***Synweights
Synweights = (double ** *)malloc((NumberOfLayers - 1) * sizeof(double **));
for (l = 0; l < NumberOfLayers - 1; l++) {
    Synweights[l] = (double **)malloc(NeuronsPerLayer[l] * sizeof(double *));
    for (i = 0; i < NeuronsPerLayer[l]; i++) {
        Synweights[l][i] = (double *)malloc((NeuronsPerLayer[l + 1] - bias[l + 1]) * sizeof(double));
    }
}
4

2 回答 2

2

这取决于数组的结构。

Synweights是数组数组的数组,这意味着在不同的位置有许多内存块。如果你有一个指向这种结构的指针,你可以用指针做同样的事情:

float p*** = new float**[sizeL];
for(int l=0; l<sizeL; ++l)
{
    p[l] = new float*[sizeI];
    for(int i=0; i<sizeI; ++i)
        p[l][i] = new float[sizeJ];
}

...
    p[l][i][j] = 0; // Access

如果您只有一块被解释为 3D 数组的内存块,您需要进行一些算术运算。无论如何,这应该是您需要 CpenCL 的情况。

float* p = new float[sizeL*sizeI*sizeJ];

...
    p[(l*sizeI+i)*sizeJ+j] = 0; // Access
    p + ((l*sizeI+i)*sizeJ+j);  // Direct address/pointer calculation

由于缓存性能和地址计算更少,此变体更快。如果您打算多次访问,则可以存储计算的索引。

于 2013-07-02T08:26:07.123 回答
0

可以通过以下方式访问三维数组;

T* myArray = new T[3][4][5];
T* aParticularT = myArray[1][2][2];
T* anArrayOfTs = myArray[1][2];
T* aTwoDimensionalArrayOfTs = myArray[1];
T* aThreeDimensionalArrayOfTs = myArray;
aTypeName aMemberOfT = aParticularT->memberName;
于 2013-07-02T08:31:40.980 回答