VB.NET中是否支持多维数组的逐元素比较?
.NET中实现二维数组逐元素比较的方法
你可以不用手动写嵌套for循环,用LINQ就能简化实现,当然如果追求性能,手动循环也是直接且高效的选择,以下是两种方案:
1. 使用LINQ简化代码
利用LINQ的Zip和Enumerable.Range,可以将二维数组的行和元素逐一对应比较,生成目标矩阵:
Dim A(4, 4) As Integer = {{1, 2, 3, 4}, {2, 3, 4, 1}, {3, 4, 1, 2}, {4, 1, 2, 3}} Dim B(4, 4) As Integer = {{1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4}} ' 把二维数组转换为可枚举的行序列 Dim rowsA = Enumerable.Range(0, A.GetLength(0)).Select(Function(i) Enumerable.Range(0, A.GetLength(1)).Select(Function(j) A(i, j)) End Function) Dim rowsB = Enumerable.Range(0, B.GetLength(0)).Select(Function(i) Enumerable.Range(0, B.GetLength(1)).Select(Function(j) B(i, j)) End Function) ' 逐行逐元素比较,生成Integer类型的结果矩阵(1/0对应布尔值) Dim C = rowsA.Zip(rowsB, Function(rowA, rowB) rowA.Zip(rowB, Function(a, b) If(a = b, 1, 0)).ToArray() End Function).ToArray()
如果需要的是Boolean类型的矩阵,只需把If(a = b, 1, 0)替换为a = b即可。
2. 手动嵌套循环(高性能选项)
如果处理的数组规模较大,手动循环的性能会优于LINQ,逻辑也更直观:
Dim A(4, 4) As Integer = {{1, 2, 3, 4}, {2, 3, 4, 1}, {3, 4, 1, 2}, {4, 1, 2, 3}} Dim B(4, 4) As Integer = {{1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4}} Dim n As Integer = A.GetLength(0) Dim C(n - 1, n - 1) As Integer For i As Integer = 0 To n - 1 For j As Integer = 0 To n - 1 C(i, j) = If(A(i, j) = B(i, j), 1, 0) Next Next
需要注意的是,.NET没有像NumPy那样原生支持数组的向量化逐元素操作,但通过上述两种方式,都能实现你需要的功能。
内容的提问来源于stack exchange,提问作者mygrandclarity
相关产品推荐
相关产品推荐

