矩阵构造函数索引超出范围

贾伦霍尔茨

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

    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);

我究竟做错了什么?

用户名

列表(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(Array of Array)和double[][]结果;大小更改时列表会更好,这可能不适用于此处。

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

甚至使用多维数组,它可能比上面的方法更合适。由于数组不可调整大小,因此与“列表容量”参数不同,该大小用于设置边界。

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

请参阅以下问题,这些问题也与对构造函数参数的错误使用有关

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章