Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970

    [VB.NET] Fronte di salita in una matrice

    So a priori che la mia domanda non è prettamente legata al linguaggio VB.NET ma forse di più legata ad un algoritmo matematico, ma la pongo comunque.

    Ho una matrice molto lunga contenente n elementi, popolata da un'acquisizione di un segnale analogico. Diciamo che ad un certo punto nella matrice i valori iniziano a salire rapidamente e io vorrei stabilire con precisione il punto in cui la curva inizia a salire.
    A digiuno di algoritmi matematici efficienti mi è venuto in mete questo:

    [code]
    Dim matrix(10000) As Double
    Dim matrixTemp(4) As Double
    Dim indexStart As Integer
    Dim start As Integer
    Dim [end] As Integer = 4

    'Popolo la mtrice matrix

    For x As Integer = 0 To matrix.GetUpperBound(0)
    Dim i As Integer
    For c As Integer = start To [end]
    matrixTemp(i) = matrix(x)
    i += 1
    Next
    'slope è una funzione che mi restituisce il coefficiente angolare della retta.
    If slope(matrixTemp) >= 0.2 Then
    indexStart = x
    Exit For
    End If
    start += 1
    [end] += 1
    Next
    [/code)


    In pratica scompongo la matrice originale in sub matrici da 5 elementi, calcolo tramite la regressione lineare della mini matrice l'inclinazione della retta risultante e la confronto poi con un valore. Se l'inclinazione della retta supera un certo valore allora significa che in quel punto la curva è in salita.

    Ma tutto ciò non mi convince, qualcosa di più efficiente ?
    Grazie
    Sbagliare è umano, perseverare è diabolico.

  2. #2
    Non so cosa faccia Slope, anche perché normalmente una retta passa per due punti e non per 5, a meno che non siano, per l' appunto, in linea retta, che è un caso limite... per cui passo la mano sull' algoritmo.

    Io semplificherei il codice, passando a Slope 5 valori integer e non una matrice:

    codice:
    Dim matrix(10000) As Double
    Dim indexStart As Integer
    
    For x As Integer = 0 To matrix.Lenght - 6
    
      'slope è una funzione che mi restituisce il coefficiente angolare della retta.
      If slope(matrix(x), matrix(x+1), matrix(x+2), matrix(x+3), matrix(X+4)) >= 0.2 Then
          indexStart = x
          Exit For
      End If
    
    Next
    bye

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Grazie comunque per avere risposto.

    Lo slope non è altro che il coefficiente angolare della retta calcolata tramite la regressione lineare

    Non mi sembra importante di che tipo sia il parametro che passo alla funzione Slope ma se l'algoritmo che uso sia efficiente o ci sia un modo più performante.

    Per informazione il coefficiente angolare tramite la regressione lineare si calcola in questo modo:

    codice:
     Public Function Slope(ByVal Valori As Double(), ByVal Tempo As Double()) As Double
            Try
                Dim SommaVal As Double
                Dim SommaTemp As Double
                Dim SommaMulti As Double
                Dim SommaValSq As Double
                Dim SommaTempSq As Double
                For i As Integer = 0 To Valori.GetUpperBound(0)
                    SommaVal += Valori(i)
                    SommaTemp += Tempo(i)
                    SommaMulti += Valori(i) * Tempo(i)
                    SommaValSq += Valori(i) ^ 2
                    SommaTempSq += Tempo(i) ^ 2
                Next i
                Return (Tempo.GetUpperBound(0) * SommaMulti - SommaVal * SommaTemp) / (Tempo.GetUpperBound(0) * SommaTempSq - (SommaTemp ^ 2))
            Catch ex As Exception
                Throw New Exception(ex.Message)
            End Try
        End Function
    Sbagliare è umano, perseverare è diabolico.

  4. #4
    Scusa, puoi fare un esempio pratico di cosa intendi per "valori che iniziano a salire rapidamente"?
    Potresti per esempio riportare un tot di valori sequenziali, l' ultima decina quelli che indicano ciò che tu intendi per una rapida salita...

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Forse una foto è più esplicativa:



    I valori dell'asse Y variano da -0.5 a 2,5. Nel caso del primo picco ad esempio si passa da un valore di -0.1 a circa 1,05.
    Sbagliare è umano, perseverare è diabolico.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.