日々の記録

ほどよく書いてきます。

Savitzky-Golayフィルタ

2023年03月26日 23時27分21秒 | プログラム

Savitzky-Golayフィルタ関数を定義します。この関数では、入力データの配列、窓幅、多項式次数、微分の次数を引数として取ります。

Function SavitzkyGolayFilter(data As Variant, window As Integer, order As Integer, deriv As Integer) As Variant
    Dim i As Integer, j As Integer, k As Integer
    Dim sum As Double, a As Double, b As Double
    Dim coef() As Double
    Dim filteredData() As Double
    Dim n As Integer
    n = UBound(data)
    ReDim filteredData(n)
    ReDim coef(order + 1, window)
    For i = 0 To n
        sum = 0
        For j = -window To window
            If (i + j >= 0 And i + j <= n) Then
                For k = 0 To order
                    coef(k, j + window) = coef(k, j + window) + (j ^ k)
                Next k
                sum = sum + data(i + j)
            End If
        Next j
        filteredData(i) = sum
    Next i
    For i = 0 To order
        For j = 0 To window
            coef(i, j) = coef(i, j) / coef(0, window)
        Next j
    Next i
    For i = 0 To n
        a = 0
        For j = -window To window
            If (i + j >= 0 And i + j <= n) Then
                a = a + coef(deriv, j + window) * data(i + j)
            End If
        Next j
        filteredData(i) = a
    Next i
    SavitzkyGolayFilter = filteredData
End Function

 

実際にフィルタリングを行うには、以下のように関数を呼び出します

Sub ApplySavitzkyGolayFilter()
    Dim inputData() As Double
    inputData = Range("A1:A100").Value
    Dim window As Integer
    window = 5
    Dim order As Integer
    order = 2
    Dim deriv As Integer
    deriv = 0
    Dim outputData() As Double
    outputData = SavitzkyGolayFilter(inputData, window, order, deriv)
    Range("B1:B100").Value = outputData
End Sub

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

エクセルで作る正規分布乱数

2023年03月26日 11時25分11秒 | プログラム

Excelでは、NORM.INV関数を使用して、指定された平均値と標準偏差に基づいて正規分布する乱数を生成することができます。以下の手順に従って、正規分布する乱数を作成してください。

  1. 平均値と標準偏差を決定します。例えば、平均値を10、標準偏差を2に設定したい場合は、それぞれセルに入力します。

  2. NORM.INV関数を使用して、正規分布する乱数を生成します。関数の構文は以下の通りです。

    NORM.INV(probability, mean, standard_dev)

    probability引数は、0から1までの確率値です。mean引数は、正規分布の平均値を指定します。standard_dev引数は、正規分布の標準偏差を指定します。

    例えば、セルA1に=NORM.INV(RAND(),10,2)と入力することで、セルA1に平均値10、標準偏差2の正規分布する乱数を生成することができます。

  3. RAND()関数を使用して、0から1までのランダムな数値を生成します。この数値は、NORM.INV関数のprobability引数に渡されます。RAND()関数を使用することで、平均値と標準偏差に従う正規分布する乱数を生成することができます。

    例えば、セルA1に=NORM.INV(RAND(),10,2)と入力することで、セルA1に平均値10、標準偏差2の正規分布する乱数を生成することができます。

  4. 上記の手順を繰り返すことで、必要な数の正規分布する乱数を生成することができます。例えば、10個の正規分布する乱数を生成する場合は、セルA1に上記の式を入力し、セルA2からA10に同じ式をコピー&ペーストします。

以上の手順に従うことで、Excelで正規分布する乱数を作成することができます。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

VBAで実装するクイックソート(メモ)

2023年03月26日 11時21分18秒 | プログラム

サブルーチンとして次を定義しておく。

Sub QuickSort(arr As Variant, firstIndex As Long, lastIndex As Long)
    Dim pivot As Variant
    Dim pivotIndex As Long
    Dim leftIndex As Long
    Dim rightIndex As Long
    
    If firstIndex < lastIndex Then
        pivot = arr(lastIndex)
        pivotIndex = firstIndex - 1
        leftIndex = firstIndex
        
        For rightIndex = firstIndex To lastIndex - 1
            If arr(rightIndex) <= pivot Then
                pivotIndex = pivotIndex + 1
                Swap arr(pivotIndex), arr(rightIndex)
            End If
        Next rightIndex
        
        pivotIndex = pivotIndex + 1
        Swap arr(pivotIndex), arr(lastIndex)
        
        Call QuickSort(arr, firstIndex, pivotIndex - 1)
        Call QuickSort(arr, pivotIndex + 1, lastIndex)
    End If
End Sub

Sub Swap(ByRef a As Variant, ByRef b As Variant)
    Dim temp As Variant
    temp = a
    a = b
    b = temp
End Sub

 

呼び出しは次のようにする

Dim arr As Variant
arr = Array(4, 2, 3, 1, 5)
Call QuickSort(arr, 0, UBound(arr))

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする