在C#中处理矩阵时使用多维或锯齿数组?

在C#中处理矩阵时使用多维或锯齿数组?,c#,matrix,multidimensional-array,jagged-arrays,C#,Matrix,Multidimensional Array,Jagged Arrays,我觉得标题很清楚,所以我在这里写一些个人的看法 考虑一个数字矩阵,C#代码中的等价表示分别是double[,]和double[][]。当使用多维数组(在这种特定情况下为2D)时,可以很容易地看到,不必检查是否存在任何空引用的double[],也不必检查行的大小是否相同,这样可以更好地理解核心问题。从我的观点来看,它更准确地描述了矩阵,因为在大多数情况下,矩阵应该被视为单个实体,而不是数组列表 但是使用多维数组可能会产生更多的代码行。如果要对其应用数学运算,比如换位,他必须使用嵌套循环,如 var

我觉得标题很清楚,所以我在这里写一些个人的看法

考虑一个数字矩阵,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];
    }
}

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

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

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


然而,如果你有一个矩阵,你想找到它的行列式,那么对它使用共因子的方法会更简单。如果您不熟悉该方法,则需要将矩阵分解为更小的矩阵,最终转换为2x2版本,在该版本中,您只需执行
a*d-b*c
。这在交错矩阵中是不可能的。

检查这个答案交错数组在代码中有点笨拙,但在运行时效率更高。多维数组的数组边界检查很难消除。当你也消除了笨拙,这是一个不需要动脑筋的问题。是的,我读了这个答案,谢谢你。但在这种情况下,我想我应该更多地关注代码的可读性,而不是性能问题。当我说可读性时,我实际上是指在数学上更类似于问题。所以基本上,使用最适合问题的一个,对吗?是的,但现在我们来讨论一个新问题。如果在不同的模块中使用不同的结构,如何在它们之间转换?我必须使用嵌套for循环迭代每个元素,还是有更好的方法?不,你不能神奇地用不同的元素一次填充一个二维数组,即复杂度为O(1)。您可以执行
array.fill(x)
它用元素
x
填充数组。但是,如果要输入两个或更多不同的值,则必须遍历每个单元格。无论哪种方式,所有操作都需要遍历数组的每个单元。这回答了你的问题吗?是的,尽管我有点失望,没有更好的办法。谢谢您的友好回复。:)@TommyT:如果向上箭头对您有帮助,请确保单击它;如果它解决了您的问题,请单击复选标记。不客气。
var newmat = Enumerable.Range(0, mat[0].Length - 1).
    Select(i => mat.Select(r => r[i]).ToArray()).ToArray();