3 dimension arrays

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Feb 26 15:25:22 PST 2015


On 02/26/2015 12:01 PM, Andrey wrote:> HI guys!!!
 >
 > Have a problem with 3d array memory allocation in next code:
 >
 > //////////////////////////////////////////////////////////
 > class NeuronNet(T, const uint layersNum)
 > {
 >      T[]                    _inputs;
 >      T[][layersNum - 2]    _hidden;
 >      T[]                    _outputs;
 >      T[]                    _target;
 >
 >      //waights [col][row][dimension]
 >      T[][][layersNum - 1] _waightsArray;

(Unrelated: That may be a typo if its actually "weights".)

 >      this(in uint[] nodesArr)
 >      {
 >          //values init
 >          _inputs = new T[nodesArr[0]];
 >          _outputs = new T[nodesArr[$-1]];
 >
 >          for(uint j = 0; j < layersNum - 2; j++)

Better:

     foreach (j; 0 .. layersNum - 2)

 >          {
 >              _hidden[][j] = new T[nodesArr[j + 1]];

You have extra [] up there. This is equivalent:

              _hidden[j] = new T[nodesArr[j + 1]];

The reason is, _hidden[] means "the entire _hidden slice" anyway. So, 
the empty [] has no meaning at all.

 >          }
 >          //waights init
 >          for(uint i = 0; i < layersNum - 1; i++)
 >          {
 >              _waightsArray[][][i] = new T[][nodesArr[1+i]];

Same there:

              _waightsArray[i] = new T[][nodesArr[1+i]];

 >              for(uint ii = 0; ii < nodesArr[1+i]; ii++)
 >              {
 >                  _waightsArray[][ii][i] = new T[nodesArr[i]];

You want to set ii'th element of the i'th element, right? This is the 
right way to do it in D:

     _waightsArray[i][ii] = ...

Unlike C and C++, the array syntax is natural in D. In other words, it 
is not "inside out".

      T[] --> A slice of Ts
      T[][] --> A slice of T slices
      T[][][layersNum - 1] --> A number of those

So, _waightsArray[i] is one of the slices that you've just set in the 
previous for loop.

Ali



More information about the Digitalmars-d-learn mailing list