在c#中,多维数组double[,]和数组的数组double[][]有什么区别?
如果有区别,每一种的最佳用途是什么?
在c#中,多维数组double[,]和数组的数组double[][]有什么区别?
如果有区别,每一种的最佳用途是什么?
当前回答
这可能在上面的回答中提到过,但没有明确地提到:对于锯齿数组,您可以使用array[row]引用整行数据,但这对于多维数组是不允许的。
其他回答
多维数组是(n-1)维矩阵。
所以int[,] square = new int[2,2]是一个方阵2x2, int[,] cube = new int[3,3,3]是一个立方-方阵3x3。比例不是必需的。
交错数组只是数组的数组——每个单元格包含一个数组的数组。
所以MDA是成比例的,JD可能不是!每个单元格可以包含任意长度的数组!
使用基于John Leidegren的测试,我使用。net 4.7.2对结果进行了基准测试,这是与我的目的相关的版本,我认为我可以分享。我最初是从dotnet核心GitHub存储库中的这条注释开始的。
随着数组大小的变化,性能似乎有很大变化,至少在我的设置中是这样,1个处理器xeon, 4physical 8logical。
W =初始化一个数组,并将int I * j放入其中。 Wr = do w,然后在另一个循环中设置int x为[i,j]
随着数组大小的增长,多维似乎表现得更好。
Size | rw | Method | Mean | Error | StdDev | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
---|---|---|---|---|---|---|---|---|---|
1800*500 | w | Jagged | 2.445 ms | 0.0959 ms | 0.1405 ms | 578.1250 | 281.2500 | 85.9375 | 3.46 MB |
1800*500 | w | Multi | 3.079 ms | 0.2419 ms | 0.3621 ms | 269.5313 | 269.5313 | 269.5313 | 3.43 MB |
2000*4000 | w | Jagged | 50.29 ms | 3.262 ms | 4.882 ms | 5937.5000 | 3375.0000 | 937.5000 | 30.62 MB |
2000*4000 | w | Multi | 26.34 ms | 1.797 ms | 2.690 ms | 218.7500 | 218.7500 | 218.7500 | 30.52 MB |
2000*4000 | wr | Jagged | 55.30 ms | 3.066 ms | 4.589 ms | 5937.5000 | 3375.0000 | 937.5000 | 30.62 MB |
2000*4000 | wr | Multi | 32.23 ms | 2.798 ms | 4.187 ms | 285.7143 | 285.7143 | 285.7143 | 30.52 MB |
1000*2000 | wr | Jagged | 11.18 ms | 0.5397 ms | 0.8078 ms | 1437.5000 | 578.1250 | 234.3750 | 7.69 MB |
1000*2000 | wr | Multi | 6.622 ms | 0.3238 ms | 0.4847 ms | 210.9375 | 210.9375 | 210.9375 | 7.63 MB |
更新:最后两个测试用双[,]代替int[,]。考虑到误差,这种差异显得很显著。对于int,锯齿与md的平均比率在1.53x和1.86x之间,对于双精度,它是1.88x和2.42x。
Size | rw | Method | Mean | Error | StdDev | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
---|---|---|---|---|---|---|---|---|---|
1000*2000 | wr | Jagged | 26.83 ms | 1.221 ms | 1.790 ms | 3062.5000 | 1531.2500 | 531.2500 | 15.31 MB |
1000*2000 | wr | Multi | 12.61 ms | 1.018 ms | 1.524 ms | 156.2500 | 156.2500 | 156.2500 | 15.26 MB |
这可能在上面的回答中提到过,但没有明确地提到:对于锯齿数组,您可以使用array[row]引用整行数据,但这对于多维数组是不允许的。
简单地说,多维数组类似于DBMS中的表。 Array of Array(锯齿状数组)允许每个元素保存另一个相同类型的可变长度数组。
因此,如果您确定数据结构看起来像一个表(固定的行/列),您可以使用多维数组。锯齿数组是固定的元素&每个元素可以容纳一个可变长度的数组
例如Psuedocode:
int[,] data = new int[2,2];
data[0,0] = 1;
data[0,1] = 2;
data[1,0] = 3;
data[1,1] = 4;
我们可以把上面的表格看成一个2x2的表格:
1 | 2 3 | 4
int[][] jagged = new int[3][];
jagged[0] = new int[4] { 1, 2, 3, 4 };
jagged[1] = new int[2] { 11, 12 };
jagged[2] = new int[3] { 21, 22, 23 };
可以把上面的代码看成每一行都有可变的列数:
1 | 2 | 3 | 4 11 | 12 21 | | 22, 23
我想从未来开始,我应该在这里补充一些。net 5的性能结果,因为从现在开始,它将成为每个人都使用的平台。
这些测试与约翰·雷德格伦(2009年)使用的测试相同。
我的结果。净5.0.1):
Debug:
(Jagged)
5.616 4.719 4.778 5.524 4.559 4.508 5.913 6.107 5.839 5.270
(Multi)
6.336 7.477 6.124 5.817 6.516 7.098 5.272 6.091 25.034 6.023
(Single)
4.688 3.494 4.425 6.176 4.472 4.347 4.976 4.754 3.591 4.403
Release(code optimizations on):
(Jagged)
2.614 2.108 3.541 3.065 2.172 2.936 1.681 1.724 2.622 1.708
(Multi)
3.371 4.690 4.502 4.153 3.651 3.637 3.580 3.854 3.841 3.802
(Single)
1.934 2.102 2.246 2.061 1.941 1.900 2.172 2.103 1.911 1.911
运行在一个6核3.7GHz AMD Ryzen 1600机器上。
看起来性能比率仍然大致相同。我想说,除非你真的很难优化,否则就使用多维数组,因为语法更容易使用。