【问题标题】:Multi-dimensional or jagged array when dealing with matrix in C#?在 C# 中处理矩阵时的多维或锯齿状数组?
【发布时间】:2016-10-12 02:57:30
【问题描述】:

我觉得标题很清楚,所以我就在这里写一些个人意见。

考虑一个数字矩阵,C# 代码中的等效表示分别为double[,]double[][]。使用多维数组(本例为二维)时,可以很容易看出,既不需要检查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 没有提供解决方案,所以我更喜欢后者。但是多维数组确实有我非常喜欢的优点。谁能教我如何在它们之间进行选择?

【问题讨论】:

  • 锯齿状数组在代码中有点笨拙,但在运行时效率更高。多维数组的数组边界检查很难消除。当你也消除了笨拙时,那就不费吹灰之力了。
  • 是的,我读到了那个答案,谢谢 Abudl。但在这种情况下,我想我会更关心代码的可读性而不是性能问题。
  • 好吧,当我说可读性时,我实际上是指在“数学上”更类似于问题。

标签: c# matrix multidimensional-array jagged-arrays


【解决方案1】:

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

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

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

【讨论】:

  • 所以基本上,使用最适合问题的那个,对吗?
  • 是的,但现在我们遇到了一个新问题。如果在不同的模块中使用不同的结构,它们之间如何转换呢?我是否必须使用嵌套的 for 循环来迭代每个元素,还是有更好的方法?
  • 不,你不能神奇地一次用不同的元素填充一个二维数组,即with complexity O(1)。您可以执行array.fill(x);,它用元素x 填充您的数组。但是,如果要输入两个或更多不同的值,则必须遍历每个单元格。无论哪种方式,所有操作都涉及遍历数组的每个单元。这能回答你的问题吗?
  • 是的,虽然我有点失望,没有更好的方法。谢谢你的好意回复。 :)
  • @TommyT:如果对您有帮助,请确保单击向上箭头,如果解决了您的问题,请单击复选标记。不客气。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2019-10-21
  • 2014-03-04
相关资源
最近更新 更多