【问题标题】:Matrix Constructor Index out of range矩阵构造函数索引超出范围
【发布时间】:2014-08-15 07:28:25
【问题描述】:

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

    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] = new List(numCols);

我做错了什么?

【问题讨论】:

  • 你为什么不使用'double [][]'?
  • 稍后在项目中,我将需要位于更大矩阵左上角的相同信息。如果我使用二维数组,我需要在那时创建一个新数组(这不会是一个大问题)。我只是选择了列表,以便以后可以增加大小而无需创建任何新内容。

标签: c# visual-studio matrix indexoutofboundsexception outofrangeexception


【解决方案1】:

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

由于新List有0个元素,由于只设置了内部容量,_matrix[anyValue]是Out-Of-Range。


如果想要矩阵的 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 (Array of Array) 和 double[][] 结果;当大小发生变化时列表会更好,这可能不适用于此处。

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

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

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

看到这些问题,也与构造函数参数的错误使用有关

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2017-02-12
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多