自动初始化不同长度的锯齿状阵列

时间:2014-07-07 14:54:24

标签: c# constructor jagged-arrays

我试图在类的构造函数中将锯齿状数组的元素值初始化为0。虽然我能够指定其他变量的值,但是对于这个锯齿状数组这样做是不可能的。

问题是锯齿状数组的尺寸取决于另一个数组的值和属性。这就是我所做的,之后是我想要获得的结果。

public class PattRec
{
    public int[] Userspecified;
    private double[][][] W = new double[][][] {};

    public PattRec()
    {
        // Here are the specs about the jagged array
        Userspecified= new int[] { 3, 5, 1 }; 

        // Here I try to add "Userspecified.Lenght" elements to
        // the first dimension of the jagged array
        for (int i = 0; i < Userspecified.Length; i++)
        {
            W[i] = new double[][]
            {
                new double[]{},
                new double[]{},
            };
        }

        // Here I try to set the values of the elements of "W" to 0
        // The second and third dimension of the jagged arrays are
        // linked to the values in "Userspecified"
        for (int i = 1; i < Userspecified.Length; i++)
        {
            for (int a = 0; a < Userspecified[i]; a++)
            {
                for (int b = 0; b < Userspecified[i-1]; b++)
                {
                    W[i][a][b] = 0;
                }
            }    
        }
    }
}

最后,给出

Userspecified= new int[ ] { 3, 5, 1 };  

如果指定&#34;手动&#34;,W应具有以下尺寸:

W[0]=new double[ ][ ];
W[1]=new double[5][3];
W[2]=new double[1][5];

显然,我做错了,因为它会抛出数组超出范围的异常。我尝试在SO上使用http://msdn.microsoft.com/en-us/library/2s05feca.aspx和其他问题。

也许我从一开始就做错了......

致以最诚挚的问候,

3 个答案:

答案 0 :(得分:0)

我认为你没有正确遍历你的阵列。可以把它想象成一个二维阵列的锯齿状阵列。尝试更类似的内容,改编自this answer

foreach (double[,] array in W)
{
   for (int i = 0; i < array.GetLength(0); i++)
   {
       for (int j = 0; j < array.GetLength(1); j++)
       {
           array[i, j] = 0;
       }
   }
}

答案 1 :(得分:0)

感谢@tnw的回答,见解和评论。这看起来像我根据它的工作设法完成的代码,它适用于我。

我无法解决一个问题,但是:
我必须暗示“神经元”将包含3个元素,这是99%的时间正确但不灵活。

如果有人知道如何解决这个问题......

无论如何,这是代码:

public class PattRec
{
    public int[] neurone;
    private double[][][] W = new double[3][][];

    public PattRec()
    {
        neurone = new int[] { 3, 5, 1 };

        W[0] = new double[][] {new double[1],new double[neurone[1]]};
        W[1] = new double[][] {new double[neurone[1]],new double[neurone[0]] };
        W[2] = new double[][] {new double[neurone[2]],new double [neurone[1]] };

        foreach (double[][] array in W)
        {
            foreach (double[] item in array)
            {
                for (int i = 0; i < item.GetLength(0); i++)
                {
                    item[i] = 0;
                }    
            }

        }
    }

  // Rest of the class, some other methods here, etc.
}

答案 2 :(得分:0)

您可以使用递归方法。但是,它需要您指定神经元大小(以某种方式)和数组中每个元素的初始值。神经元大小将是内部数组的大小。

this.InitializeJaggedArray(w, 5, 3);
....
private double[][][] w = new double[3][][];
private void InitializeJaggedArray(IList arr, object initializeValue, int neuronSize)
{
    for (int i = 0; i < arr.Count; i++)
    {
        if (arr[i] == null)
        {
            arr[i] = Activator.CreateInstance(arr.GetType().GetElementType(), new object[] { neuronSize } );
        }

        if(arr[i] is IList)
        {
            InitializeJaggedArray(arr[i] as IList, initializeValue, neuronSize);
        }
        else
        {
            arr[i] = initializeValue;
        }
    }
}

这将初始化您提供给它的任何数组。