Newsgroup: it.comp.lang.visual-basic
Titolo: Valore massimo in una matrice

Dunque ho 2 matrici:
matrice1(a,b) dimensionata come integer
matrice2(a,b) dimensionata come stringa
Per trovare il valore massimo di ciascuna colonna di a della matrice1(a,b)
ho scritto il seguente codice che però mi da problemi:
For b = 1 To 1000000
Dim iX As Integer
Dim iMax As Integer
iMax = vitnum(1, b)
For iX = 1 To 1000000
If iMax < matrice1(iX, b) Then iMax = matrice1(iX, b) And maxnome =
matrice2(iX, b)
Next
MsgBox iMax & maxnome
Next
Nello specifico non mi trova il massimo della prima colonna, restituisce 0
ed inoltre nella msgbox compare il valore di iMax ma non il valore dalla
variabiel masnome.
Qualche aiuto?
Grazie

 ha scritto nel messaggio
news:4386ec17$0$8485$5fc...@news.tiscali.it...

Mi perplime :-/ molto questa istruzione:
If iMax < matrice1(iX, b) Then iMax = matrice1(iX, b) And maxnome = matrice2(iX,
b)
In pratica equivale a:
If iMax < matrice1(iX, b) Then
    iMax = (matrice1(iX, b) And (maxnome = matrice2(iX, b))
End If
Sei sicuro che faccia quello che volevi?
Bye
Raf

 Sei sicuro che faccia quello che volevi?
Dunque il concetto č:
setto imax al primo valore della matrice1 colonna b poi
se iMax č minore del elemento iXesimo della matrice1 colonna b allora iMax
diventa l'elemento iXesimo e la varibile maxnome assume il valore
dell'elemento della matrice2 con gli stessi indici demma matrice1.
Sto continuando a fare un errore di logica?

 Sto continuando a fare un errore di logica?
Dai una lettura al significato dell'operatore And.
Secondo questa logica il tuo programma dovrebbe essere qualcosa tipo:
For b = 1 To 1000000
    Dim iX As Integer AND Dim iMax As Integer AND
    iMax = vitnum(1, b) AND
    For iX = 1 To 1000000
        If iMax < matrice1(iX, b) Then iMax = matrice1(iX, b) And maxnome = 
matrice2(iX, b)
    Next
    AND
    MsgBox iMax & maxnome
Next
Ciao 

 Sto continuando a fare un errore di logica?
Non di logica, ma proprio di SINTASSI (sebbene per puro caso sia lecita per VB).
AND è un OPERATORE BOOLEANO che non serve per la concatenazione di istruzioni,
ma per costruire espressioni logiche.
Avrebbe probabilmente dovuto essere:
If iMax < matrice1(iX, b) Then
    iMax = matrice1(iX, b)
    maxnome = matrice2(iX, b)
End If
Giusto?
Ciao
Raf

 Giusto?
Hai perfettamente ragione! Uno stupido errore di sintass!
Grazie mille.
Posso approfittare e chiedere un'altra cosa?
Sto andando in loop nel cercare di fare questo:
e se ci fossero più valori massimi nella matrice?
Come dovrei fare per "raccoglierli" tutti?
Sto provando con varie soluzioni ma proprio non riesco.

 Come dovrei fare per "raccoglierli" tutti?
Devi necessariamente memorizzare i loro indici in un array dinamico (o in una
collection).
In pratica ogni volta che trovi un valore superiore al massimo temporaneo
reinizializzi l'array ad un solo elemento, mentre se è uguale "estendi" l'array
e memorizzi l'indice corrente nella nuova cella dell'array. A questo proposito
guarda l'istruzione ReDim [Preserve].
Ciao
Raf

 [Preserve].
Ok, rifletterò su quanto hai scritto (non mi è chiarissimo), io ero arrivato
ad effettuare un primo ciclo (quello che ho postato) per individuare il max
e poi un successivo ciclo che va a cercare quel max all'interno della
matrice.

 ha scritto nel messaggio
news:43872029$0$8480$5fc...@news.tiscali.it...

Se ci pensi un po' puoi scoprire che si può fare benissimo a meno del secondo
ciclo...
Ciao
Raf

 secondo ciclo...
Ok... ho letto qualcosa su Redim Preserve è ho provato...
ma sono giunto a questa conclusione che però non va :-(
Dim cont As Integer
Dim iX As Integer
Dim iMax As Integer
For i = 1 To UBound(p())
cont = 1
ReDim maxnum(cont, i) As Integer
ReDim maxnom(cont, i) As String
'iMax = 0
iMax = vitnum(1, LBound(p()))
For iX = 1 To IDsqMax
If iMax < vitnum(iX, i) Then
iMax = vitnum(iX, i)
maxnum(cont, i) = iMax
maxnom(cont, i) = vitnom(iX, i)
ElseIf iMax = vitnum(iX, i) Then
cont = cont + 1
ReDim Preserve maxnum(cont, i) <---------- QUI MI DA ERRORE DI INDICE NON
COMPRESO NELL'ITNERVALLO
ReDim Preserve maxnom(cont, i)
maxnum(cont, i) = iMax
maxnom(cont, i) = vitnom(iX, i)
End If
Next
Next
In ogni caso, grazie dell'aiuto
Ciao

 NON COMPRESO NELL'ITNERVALLO
Dalla guida leggo che posso ridimensionare solo l'ultimo indice di una
matrice... porcaccia... mi si complica tutto...

 Ciao
A parte l'indentazione un po' "piatta" del tuo codice, che non mi aiuta nella
lettura...
Cerco di aiutarti in un altro modo, ripartendo daccapo.
Ho riletto meglio il codice, all'inizio pensavo ti servissero i massimi
assoluti, non quelli per colonna.
Se ho ben capito hai 2 matrici bidimensionali, i valori (vitnum()) e i
corrispondenti nomi (vitnom()), giusto?
Devi trovare i massimi valori per ogni colonna e per ciascuno il relativo nome,
in pratica quindi è sufficiente avere per ogni colonna l'insieme degli indici di
riga delle celle che contengono il valore massimo (avendo gli indici da questi
si ricavano indirettamente i nomi e i valori).
In pratica la soluzione si può rappresentare come un "array di array dinamici",
che è ben diverso da una matrice classica, in quanto le "colonne" dell'array non
hanno necessariamente tutte lo stesso numero di elementi, non so se mi spiego.
Non è possibile però ridimensionare dinamicamente una siffatta matrice, per
quello ti esce l'errore (o forse il motivo è un altro... cos'è p()?).
Lo stratagemma per riuscirci è utilizzare un array di Variant, i cui elementi a
loro volta possono essere degli array dinamici.
(Scrivo a braccio, senza averlo provato...)
Dim MaxIndexes() As Variant
Dim temp() As Long
ReDim MaxIndexes(1 To NumCol)
For col = 1 To NumCol
    MaxTemp = -32768 ' un numero sicuramente più basso dei valori nella matrice
vitnum(), se sono Integer
    For row = 1 To NumRow
        If vitnum(row, col) > MaxTemp Then
            ' Reinizializza l'array
            ReDim temp(1 To 1)
            temp(1) = row
            MaxTemp = vitnum(row, col)
        ElseIf vitnum(row, col) = MaxTemp Then
            ' Estende l'array
            ReDim Preserve temp(1 To UBound(temp) + 1)
            temp(UBound(temp)) = row
        End If
    Next row
    ' A questo punto temp() contiene tutti gli indici delle righe con il massimo
per la colonna col
    MaxIndexes(col) = temp
Next col
Come vedi è sufficiente una sola "passata" all'intera matrice e non servono in
teoria altre strutture dati che l'array Indexes(), perché per sapere per ogni
colonna i valori massimi ed i relativi nomi, basta fare così:
For col = 1 To NumCol
    ' Trasferisce in un array di appoggio
    temp() = MaxIndexes(col)
    For i = LBound(temp) To UBound(Temp)
        row = temp(i)
        Debug.Print "Colonna "; col;" massimo: "; vitnum(row, col);" nome:";
vitnom(row, col)
    Next i
Next col
Spero che ti sia di aiuto.
Bye
Raf

 ha scritto nel messaggio
news:43873d90$0$8481$5fc...@news.tiscali.it...

Esatto... comunque dovrei averti dato una soluzione nel post che ho appena
inserito.
Ciao

 ha scritto nel messaggio
news:43873d90$0$8481$5fc...@news.tiscali.it...

Non usare matrici multidimensionali, ma piuttosto matrici di type, cosě:
Type Righe
    Colonna() As Long
End Type
Type Matrice
    Riga() As Righe
End Type
Dim MyMatrice As Matrice
In questo modo puoi fare le Redim dove vuoi e usarla in un modo piů
leggibile:
x = MyMatrice.Riga(i).Colonna(j)
Ciao
--
Reporting tool: 
http://www.neodatatype.net