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

标签 c# matrix multidimensional-array jagged-arrays

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

考虑一个数字矩阵,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 没有提供解决方案,所以我更喜欢后者。但是多维数组确实有我非常喜欢的优点。谁能教我如何在它们之间做出选择?

最佳答案

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

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

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

关于c# - 在 C# 中处理矩阵时的多维或锯齿状数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37760126/

相关文章:

c# - SshConnectionException : 'Server response does not contain SSH protocol identification.'

r - 用较小的子矩阵填充较大的矩阵

r - 使用回收创建矩阵

java - 可以对多维数组使用冒号 for 循环吗?

c# - 使用 PropertyInfo 中的新类型递归调用泛型方法?

c# - Mono 中的 IEnumerable 接口(interface)和 Skip 方法

c# - 单个文本框上的多重验证控件

r - 如何保存 data.frame-to-model.matrix 的映射并应用于新的观察?

PHP - 对多维数组进行排序时出现问题?

javascript - 在 JQuery 中创建数组的数组