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

时间:2016-06-11 05:04:41

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

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

考虑数字矩阵,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 个答案:

答案 0 :(得分:1)

这不是问题的代码行,而是代码本身的效率。

如果你有一个稀疏矩阵(矩阵几乎都是零),你想使用锯齿状矩阵,因为迭代二维矩阵搜索非零元素会浪费时间。

但是,如果你有一个矩阵并且你想找到它的决定因素,那么使用它上面的辅因子方法会更简单。如果您不熟悉该方法,则需要将矩阵分解为较小的矩阵,最终转换为2x2版本,您只需执行var myType = function(name, age) { this._name = name; this._age = age; } // Add some properties Object.defineProperties(myType.prototype, { 'name': { get: function() {return this._name;} }, 'age': { get: function() {return this._age;} } }); // Add a method myType.prototype.toString = function() { return this._name + ' is ' + this._age; } // Add a 'static' deserialize method myType.fromJSON = function(serializedMe) { var tmp = JSON.parse(serializedMe); return new myType(tmp._name, tmp._age); } var i = new myType('Steve', 38); console.log('I am ' + i.name + ' and my age is ' + i.age); // Simulate serialization var payloadToSend = JSON.stringify(i); // Send to client... // Client wants to work with full-fledged myType instance... var clientInstanceOfMyType = myType.fromJSON( payloadToSend ); console.log(clientInstanceOfMyType.toString()); 即可。锯齿状矩阵无法做到这一点。