Matrix Constructor Index超出范围

时间:2014-06-24 21:35:31

标签: c# visual-studio matrix indexoutofboundsexception outofrangeexception

我正在尝试创建自己的矩阵数学类,这是我正在使用的构造函数。

    public Matrix (int numRows, int numCols) 
    {
        _matrix = new List<List<double>>(numRows);

        // initializes each list
        for(int i = 0; i < numRows; i++)
        {
            _matrix[i] = new List<double>(numCols);
        }
    }

当我尝试使用它时,它会在行

上抛出ArgumentOutOfRangeException
  

_matrix [i] =新列表(numCols);

我做错了什么?

1 个答案:

答案 0 :(得分:2)

List(Int32) capacity构造函数参数设置元素数量;它设定了容量。容量是内部数组的大小 - 而不是集合实际实现的元素数。

由于新列表有0个元素,因为仅设置内部容量,_matrix[anyValue]超出范围。


如果需要矩阵的LoL(列表列表),使用LINQ创建非常容易。

_matrix = Enumerable.Range(0, numRows)
            .Select(r => (new double[numCols]).ToList())
            .ToList();

替代LoL生成,手动将每列添加到行,然后将每行添加到矩阵。

_matrix = new List<List<double>>();
for (var r = 0; r < numRows; r++) {
    var row = new List<double>();
    for (var c = 0; c < numCols; c++) {
        row.Add(0);
    }
    _matrix.Add(row);
}

或者使用AoA(数组数组)和double[][]结果;当尺寸改变时,列表会更好,这可能不适用于此。

double[][] m = Enumerable.Range(0, numRows)
                 .Select(r => new double[numCols])
                 .ToArray();

或者甚至使用Multidimensional Arrays,这可能比上述更合适。由于数组不可调整大小,与“List capacity”参数不同,大小设置边界。

double[,] m = new double[numRows,numCols];

请参阅这些问题,这些问题也与错误使用构造函数参数

有关