代码之家  ›  专栏  ›  技术社区  ›  Tommy T

在C#中处理矩阵时是多维数组还是交错数组?

  •  2
  • Tommy T  · 技术社区  · 9 年前

    我认为标题很清楚,所以我在这里只写一些个人意见。

    考虑一个数字矩阵,C#代码中的等效表示为 double[,] double[][] 分别地使用多维数组(在这种特定情况下为2D)时,可以很容易地看出,不必检查 double[] 或者行的大小相同,这样可以更好地理解核心问题。此外,从我的观点来看,它更准确地描述了矩阵,因为在大多数情况下,矩阵应该被视为单个实体,而不是数组列表。

    但使用多维数组可能会导致更多的代码行。如果要对其应用数学运算,例如转置,则必须使用嵌套循环,如

    var row = mat.GetLength(0);
    var col = mat.GetLength(1);
    var newmat = new double[col, row];
    for (var i = 0; i < row; i++)
    {
        for (var j = 0; j < col; j++)
        {
             newmat[j, i] = mat[i, j];
        }
    }
    

    使用交错数组,他可以简单地编写

    var newmat = Enumerable.Range(0, mat[0].Length - 1).
        Select(i => mat.Select(r => r[i]).ToArray()).ToArray();
    

    我不确定哪一个更好。通常我只创建自己的子例程,除非.Net没有提供解决方案,所以我更喜欢后者。但多维数组确实有它的优点,我真的很喜欢。谁能教我如何在两者之间做出选择?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Jossie Calderon    9 年前

    问题不在于代码行,而在于代码本身的效率。

    如果您有一个稀疏矩阵(几乎全为零的矩阵),您需要使用锯齿矩阵,因为在二维矩阵中迭代搜索非零元素会浪费时间。

    然而,如果你有一个矩阵,你想找到它的行列式,那么在它上面使用协因数的方法会更简单。如果你不熟悉这个方法,它需要把矩阵分解成更小的矩阵,最后变成2x2版本,你可以简单地执行 a*d-b*c 。对于交错矩阵,这是不可能的。