我正在寻找一种在二维数组内优雅平均的方法。我的代码适用于小范围的元素,但我需要一些可用于大量元素的内容。阵列中的平均值
这是我对少数元素的代码。此代码将在同一行上平均3个元素并将结果返回给结果数组。我如何重写这50个元素?正如你所想象的,这种方法对于大量的元素不适用。
For i = 1 To UBound(TMP)
results(i, 1) = ((TMP(i, 13) + TMP(i, 14) + TMP(i, 15))/3)
Next i
我正在寻找一种在二维数组内优雅平均的方法。我的代码适用于小范围的元素,但我需要一些可用于大量元素的内容。阵列中的平均值
这是我对少数元素的代码。此代码将在同一行上平均3个元素并将结果返回给结果数组。我如何重写这50个元素?正如你所想象的,这种方法对于大量的元素不适用。
For i = 1 To UBound(TMP)
results(i, 1) = ((TMP(i, 13) + TMP(i, 14) + TMP(i, 15))/3)
Next i
您将所需的值移动到1D数组中,然后使用application.Average()函数。例如:
Dim rwarr() As Double
For i = 1 To UBound(TMP, 1)
ReDim rwarr(1 To UBound(TMP, 2)) As Double
For j = 1 To UBound(TMP, 2)
rwarr(j) = TMP(i, j)
Next j
results(i, 1) = Application.Average(rwarr)
Next i
下面是可以采取多个列的平均值的2-d阵列的每一行中的功能。
Public Function AverageRowsIn2DArray(Arr As Variant, LBoundCol As Integer, UBoundCol As Integer) As Variant
Dim iNumValues As Integer
iNumValues = UBoundCol - LBoundCol + 1
If iNumValues < 1 Then GoTo ErrHandler
On Error GoTo ErrHandler
Dim retArr As Variant
Dim inArr As Variant
If TypeName(Arr) = "Range" Then
inArr = Arr.Value
Else
inArr = Arr
End If
ReDim retArr(1 To UBound(inArr), 1 To 1)
Dim i As Integer, j As Integer
Dim dSum As Double
For i = 1 To UBound(inArr)
dSum = 0
For j = LBoundCol To UBoundCol
dSum = dSum + inArr(i, j)
Next j
retArr(i, 1) = dSum/iNumValues
Next i
AverageRowsIn2DArray = retArr
Exit Function
ErrHandler:
AverageRowsIn2DArray = 0
End Function
在特定情况下,你会想打电话
Dim results() as Double
results = AverageRowsIn2DArray(TMP, 13, 15)
感谢功能斯科特。我做了一些修改,将输入限制在一行中。它的工作很棒!谢谢。下面是修改的功能:
Public Function AverageRowsIn2DArray(Arr As Variant, Nrow As Integer, LBoundCol As Integer, UBoundCol As Integer) As Variant
Dim iNumValues As Integer
iNumValues = UBoundCol - LBoundCol + 1
If iNumValues < 1 Then GoTo ErrHandler
On Error GoTo ErrHandler
Dim retArr As Integer
Dim inArr As Variant
If TypeName(Arr) = "Range" Then
inArr = Arr.Value
Else
inArr = Arr
End If
Dim i As Integer, j As Integer
Dim dSum As Double
For i = LBoundCol To UBoundCol
dSum = dSum + inArr(Nrow, i)
Next i
retArr = dSum/iNumValues
AverageRowsIn2DArray = retArr
Erase inArr
retArr = 0
Exit Function
ErrHandler:
AverageRowsIn2DArray = 0
End Function
现在我的电话是,
results(i, 4) = AverageRowsIn2DArray(TMP, i, 13, 15)
假设你已经在第一等级小于30K的元素,使用WorksheetFunction objectINDEX function剥离一行来处理AVERAGE自。
Sub avgVals()
Dim tmp As Variant, results As Variant, a As Long
With Worksheets("Sheet2")
With .Cells(1, 1).CurrentRegion
With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0)
tmp = .Cells.Value2
End With
ReDim results(LBound(tmp, 1) To UBound(tmp, 1), 1 To 1)
For a = LBound(tmp, 1) To UBound(tmp, 1)
results(a, 1) = Application.Average(Application.Index(tmp, a, 0))
Next a
With .Resize(.Rows.Count - 1, 1).Offset(1, .Columns.Count)
.Cells.Resize(UBound(results, 1), UBound(results, 2)) = results
End With
End With
End With
End Sub
使用Excel Application object方便INDEX切片数组与众不同的是不是最快的方法,并最终有limiations但它可以提供实现你AVERAGE结果小批量的有利方法。
感谢您的帮助斯科特! – centurion79b