Multi-dimensional 或在 C# 中处理矩阵时出现锯齿状数组?

Multi-dimensional or jagged array when dealing with matrix in C#?

我觉得标题说的很清楚了,这里就写点个人看法吧。

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

但是使用multi-dimensional数组可能会导致代码行数增加。如果有人想对其应用数学运算,比如转置,他将不得不使用嵌套循环,如

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 没有提供解决方案,所以我更喜欢后者。但是 multi-dimensional 数组确实有我非常喜欢的优点。谁能教我如何在它们之间进行选择?

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

如果您有一个稀疏矩阵(几乎全为零的矩阵),您希望使用锯齿状矩阵,因为遍历二维矩阵搜索非零元素会浪费时间。

但是,如果你有一个矩阵并且你想找到它的行列式,那么在它上面使用余因子的方法会更简单。如果您不熟悉该方法,它涉及将矩阵分解为更小的矩阵,最终分解为 2x2 版本,您可以在其中简单地执行 a*d-b*c。这对于锯齿状矩阵是不可能的。