+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

Max e min di un array a piu' dimensioni

  1. #1
    mirko non è in linea Novello
    Ciao a tutti, volevo un supporto in merito a come valutare il valore massimo (e minimo) di un array a 2 dimensioni (e a questo punto anche a più dimensioni).
    Premetto che sono uno smanettone e non sono un "esperto"...provo a spiegarmi con un esempio:

    - Ho un ciclo for/next con i=0 a 2
    - per ogni valore di i ottengo j risultati (con j=5)

    in poche parole avrei:

    passo i=0
    valore(0,0)=num0
    valore(0,1)=num1
    valore(0,2)=num2
    valore(0,3)=num3
    valore(0,4)=num4

    passo i=1
    valore(1,0)=num0
    valore(1,1)=num1
    valore(1,2)=num2
    valore(1,3)=num3
    valore(1,4)=num4

    passo i=2
    valore(2,0)=num0
    valore(2,1)=num1
    valore(2,2)=num2
    valore(2,3)=num3
    valore(2,4)=num4



    Se avessi un array ad una sola dimensione, ovvero se i fosse uno scalare e non un vettore, il massimo lo otterrei in questo modo:

    Dim valore(0 to 4) as double

    Dim MAX_VALUE_i As Nullable(Of Double) = valore.Max()


    Quello che voglio fare è ottenere il massimo dei valori j-esimo per ogni passo i.

    Spero di essere stato chiaro.

    Ringrazio a chi vorrà rispondere.

  2. #2
    Utilizza un ciclo annidato dentro il primo For, per scorrere i valori j, e con i metodi Sistem.Math.Min e System.Math.Max memorizzi i valori minimi e massimi confrontando l’elemento ciclato con una variabile, tenendo memorizzato nella variabile sempre il valore minore o maggiore.

    Al termine di ogni ciclo annidato di j, avrai nelle variabili i valori minimi e massimi per quel determinato indice di i.
    ℹ️ Leggi di più su Fix ...

  3. #3
    mirko non è in linea Novello
    Grazie Fix, sei stato molto gentile.
    Questa cosa dei cicli annidati non la sapevo. Ho provato a cercare su internet, ma per ora nn ho trovato molto. Ho capito il concetto, ma non saprei come metterlo in pratica. E' troppo se ti chiedo di farmi un piccolo esempio con un codice anche molto semplice?
    Grazie
    MK

  4. #4
    I cicli annidati sono, ad esempio

    For i=0 To 10
       For j=0 To 20
         ...
       Next
    Next
    
    Davvero non li conosci? Sono le basi di qualsiasi linguaggio, a maggior ragione di qualsiasi BASIC ...
    ℹ️ Leggi di più su AntonioG ...

  5. #5
    mirko non è in linea Novello
    Grazie
    in realtà forse mi sono spiegato male. Forse non li ho mai conosciuti come termine "annidato"...essendo autodidatta
    In ogni caso chiedevo contestualmente alla mia esigenza un piccolo esempio, dal momento che ho a che fare con array a 2 dimensioni. Provo a capire bene come applicare la risposta di Fix al mio problema e proverò a farvi vedere il risultato. Intanto grazie

  6. #6
    Come ha scritto Antonio, il ciclo annidato non è altro che un ciclo dentro un altro ciclo.

    Nel primo ciclo, scorri la dimensione "0" (i) della Matrice, mentre nel secondo ciclo (annidato) scorri la dimensione "1" (j)

    Se non conosci a priori gli indici massimi delle 2 dimensioni, puoi usare il metodo GetUpperBound(int32) che ti restituisce l'indice massimo della dimensione specificata come argomento (Int32)

    Matrice.GetUpperBound(0) -> Ritorna indice massimo della prima dimensione, nel tuo caso di "i"
    Matrice.GetUpperBound(1) -> Ritorna indice massimo della seconda dimensione, nel tuo caso di "j"

    Ti posto un esempio, nella speranza che sia da spunto per approfondimenti.

            Dim MaxValue As Double
    Dim MinValue As Double

    For index_i = 0 To Matrice.GetUpperBound(0)

    '-- reset delle variabili
    MinValue = Double.MaxValue
    MaxValue = Double.MinValue

    For index_j = 0 To Matrice.GetUpperBound(1)
    '-- memorizzazione dei valori minimi e massimi dell'indice i
    MinValue = System.Math.Min(MinValue, Matrice(index_i, index_j))
    MaxValue = System.Math.Max(MaxValue, Matrice(index_i, index_j))
    Next

    '-- gestione dei valori memorizzati, prima del reset successivo
    MessageBox.Show(String.Format("Ciclo:{0} - Valore_Minimo:{1} - Valore_Massimo:{2}",
    index_i.ToString, MinValue.ToString, MaxValue.ToString))

    Next
    ℹ️ Leggi di più su Fix ...

  7. #7
    mirko non è in linea Novello
    Grazie a entrambi.
    Ho provato a fare un esempio prima di ricevere il tuo msg, e sembra funzionare.
    Provo a riportarvelo per capire se ho scritto castronerie oppure no:

    Dim i, j As Integer
    Dim numbers(5, 5) As Double

    For i = 0 To 5

    numbers(i, 0) = Math.Sin(i) + Math.Cos(i)
    numbers(i, 1) = Math.Sin(i) - Math.Sin(i) * Math.Cos(i)
    numbers(i, 2) = Math.Cos(i ^ 0.5) * Math.Sin(i) - Math.Sin(i) * Math.Cos(i)
    numbers(i, 3) = Math.Sin(i ^ 0.5) + Math.Cos(i ^ 3)
    numbers(i, 4) = Math.Sin(i ^ 5) - Math.Sin(i) * Math.Cos(i)
    numbers(i, 5) = Math.Cos(i ^ 0.5) + Math.Cos(i ^ 3)

    Dim max As Double = numbers(0, 1)


    For j = 1 To numbers.GetUpperBound(0)

    max = System.Math.Max(Math.Round(max, 2), numbers(i, j))
    Next
    MessageBox.Show("Max value is = " & max.ToString)

    Next

  8. #8
    Premessa:
    Utilizza il Tag “code” per racchiudere il codice (simbolo # nella barra degli strumenti del forum)

    In merito al codice che hai postato:
    Il ciclo annidato parte con un indice = 1, è voluto ?
    Gli indici sono a base 0, per cui in questo modo perdi il primo elemento.

    Il GetUpperBound(0) ti restituisce l’estremo indice della prima dimensione (i) mentre nel ciclo annidato devi recuperare l’estremo della seconda dimensione (j), per cui modifica con GetUpperBound(1)

    In merito alla variabile “Max”, quando la resetti prima di confrontarla (se la resetti con un valore arbitrario), assicurati di assegnarle un valore che non sia superiore al valore massimo ottenibile dalla matrice, altrimenti il valore di reset risulterà essere sempre il maggiore.
    Ultima modifica di Fix; 22-03-2021 17:05 
    ℹ️ Leggi di più su Fix ...

  9. #9
    mirko non è in linea Novello
    Per il tag hai ragione. Non ho ancora dimistichezza con gli strumenti di questo forum.
    in ogni caso hai ragione su quanto scrivi.
    Volevo chiedere un'ulteriore cosa:
    1 - Come si può valutare il passo i-esimo corrispondente al massimo valore j?
    2 - Come si può valutare la somma di tutti i valori j ad ogni passo i?

    Grazie ancora

  10. #10
    In cosa trovi difficoltà ?

    Dentro il ciclo annidato, scorrendo gli elementi, hai la possibilità di:
    • Memorizzarli tutti in un nuovo "contenitore", quindi eseguire una somma posticipata al ciclo
    • Sommarli sequenzialmente, quindi eseguire la somma man mano che cicli
    All'uscita del ciclo di J, avrai la somma di tutti gli elementi contenuti nell'indice I, oltre a conoscere l'indice I corrispondente al risultato.

    Per l'i-esimo corrispondente dovrai usare altre 2 variabili:
    1. Una per memorizzare il valore massimo precedente
    2. Una per memorizzare l'indice i-esimo corrispondente al valore massimo di J
    Dentro il ciclo di J confronti il valore massimo corrente (variabile max) con quello precedente e:
    • Se il massimo corrente è maggiore del precedente, imposti il valore precedente = a quello correte e memorizzi l'indice I corrente nella variabile
    • Se i valori sono uguali, non fai nulla perchè il massimo corrente non è cambiato
    Ultima modifica di Fix; 23-03-2021 13:11 
    ℹ️ Leggi di più su Fix ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Accodare velocemente un Array ad un altro Array
    Da Neway nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 08-11-2010, 13:42
  2. Problema con Array di Grandi Dimensioni
    Da VBest nel forum Visual Basic 6
    Risposte: 9
    Ultimo Post: 01-09-2009, 15:06
  3. Array a più dimensioni
    Da Nottambulo nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 29-04-2009, 08:52
  4. Risposte: 3
    Ultimo Post: 12-05-2008, 20:47
  5. Risposte: 2
    Ultimo Post: 05-11-2005, 09:22