0

標準偏差を計算するためのコードがあります。

Public Function StandardDeviation(ByRef arr() As Double) As Double

'standard deviation
Dim sum As Double
Dim sumSquare As Double
Dim value As Double
Dim count As Long
Dim index As Long
sum = 0
sumSquare = 0
value = 0
count = 0
index = 0

' evaluate sum of values
For index = LBound(arr) To UBound(arr)
    value = arr(index)
    count = count + 1
    sum = sum + value
    sumSquare = sumSquare + value * value
Next

StandardDeviation = Sqr((sumSquare - (sum * sum / count)) / count)

End Function

うまくいくようです。

たまたま、値がすべて同じになる場合があります。次に例を示します。

    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645
    0.419208025523645

このような場合、次の行に「無効な引数」というエラーが表示されます。

StandardDeviation = Sqr((sumSquare - (sum * sum / count)) / count)

誰かが私の間違いを見ますか?

4

2 に答える 2

3

私の推測では、負の値の平方根を「取得しようとしている」という問題が発生していると思います。数値がすべて同じである場合、sumSquareは(sum * sum / count)と同じである必要があります。

次のコードをお勧めします。

If ((sum * sum / count)) > sumSquare Then
    StandardDeviation = 0
Else
    StandardDeviation = Sqr((sumSquare - (sum * sum / count)) / count)
End If
于 2013-01-13T19:49:41.870 に答える
0

ループの外側のカウンターを削除することで、計算を高速化できます

For index = LBound(arr) To UBound(arr)
  value = arr(index)
  sum = sum + value
  sumSquare = sumSquare + value * value
Next

count = UBound(arr) - LBound(arr)  + 1
于 2013-01-20T15:11:54.543 に答える