在VBA中查找多维数组中最小值的索引
问题描述:
在下面的代码中,我有一个n x n x n数组值。我需要确定包含最小值,第二到最小值,第三到最小值......的索引,并将它们放入它们自己的数组中,以便稍后在代码中使用。 CC目前定义为11 x 11 x 11阵列,我需要确定最小值。下面是包含这些值的我的数组CC的设置。 n被定义为数组h2s的长度,在这种情况下碰巧是11。 h2st是h2s中的值的总和。在VBA中查找多维数组中最小值的索引
h2s = [1.099, 0.988, 0.7, 0.8, 0.5, 0.432, 0.8, 1.12, 0.93, 0.77, 0.658]
h2st = 0
n = Ubound(h2s) - Lbound(h2s) + 1
For i = 1 to n
h2st = h2st + h2s(i)
Next i
For i = 1 To n
For j = i + 1 To n
For k = j + 1 To n
CC(i, j, k) = Abs(h2st - ((h2s(i) + h2s(j) + h2s(k)) * (n/3)))
Next k
Next j
Next i
答
您可以使用此函数,它接受一个多维数组并返回其n个最小值的数组,其中n是一个参数。重要的是,返回数组中的元素是一个数据结构Type Point
,包含每个找到的点的坐标和值。
您可以轻松地调整它找到N MAX值,仅仅通过在代码改变两个字符,如在评论中指出(初始化和比较)
Option Explicit
Type Point
X As Long
Y As Long
Z As Long
value As Double
End Type
Function minVals(ar() As Double, nVals As Long) As Point()
Dim i As Long, j As Long, k As Long, m As Long, n As Long, pt As Point
'Initialize returned array with max values.
pt.value = 9999999# ' <-------- change to -9999999# for finding max
ReDim ret(1 To nVals) As Point
For i = LBound(ret) To UBound(ret): ret(i) = pt: Next
For i = LBound(ar, 1) To UBound(ar, 1)
For j = LBound(ar, 2) To UBound(ar, 2)
For k = LBound(ar, 3) To UBound(ar, 3)
' Find first element greater than this value in the return array
For m = LBound(ret) To UBound(ret)
If ar(i, j, k) < ret(m).value Then ' <------- change to > for finding max
' shift the elements on this position and insert the current value
For n = UBound(ret) To m + 1 Step -1: ret(n) = ret(n - 1): Next n
pt.X = i: pt.Y = j: pt.Z = k: pt.value = ar(i, j, k)
ret(m) = pt
Exit For
End If
Next m
Next k
Next j
Next i
minVals = ret
End Function
Sub Test()
Dim i As Long, j As Long, k As Long, pt As Point
Const n As Long = 11
ReDim CC(1 To n, 1 To n, 1 To n) As Double
For i = 1 To n
For j = 1 To n
For k = 1 To n
CC(i, j, k) = Application.RandBetween(100, 100000)
Next k
Next j
Next i
' Testing the function: get the smalles 5 values and their coordinates
Dim mins() As Point: mins = minVals(CC, 5)
' Printing the results
For i = LBound(mins) To UBound(mins)
Debug.Print mins(i).value, mins(i).X, mins(i).Y, mins(i).Z
Next
End Sub
+0
我收到了编译错误和类型错误:数组或预期的用户定义类型。 –
+0
这实际上已经修复。这段代码很棒。谢谢! –
你需要跟踪多少个数值 - 只是一个(相对)小的数字,还是你需要对它们进行排序? –
能够轻松调整我想要的最小数量会很好,但10可能是最大值。 –
此外,您可以将此代码添加到您之前的问题中,而不是发布一个新的问题... –