我认为标题很清楚,所以我在这里写一些个人意见。
考虑数字矩阵,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没有提供解决方案,所以我更喜欢后者。但是多维阵列确实有我喜欢的优点。任何人都可以教我如何在它们之间做出选择吗?
答案 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());
即可。锯齿状矩阵无法做到这一点。