• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

individueel product van 2 arrays

Status
Niet open voor verdere reacties.

cow18

Terugkerende gebruiker
Lid geworden
24 mei 2008
Berichten
4.276
Besturingssysteem
Windows
Office versie
Excel365
dit is eigenlijk nogal basic, maar hoe bepaal je het maximum van individueel product van 2 arrays in VBA.
Ik dacht gewoon met MMULT, maar daarmee ga ik de mist in.
Zie bijlage, dat is een voorbeeldje van 17 rijen, maar in mijn geval is dat getal dynamisch en >100.000, dus voor MMULT ook al slikken.
Ik wil dus de waarde van D1 bekomen maar over een iets grotere omvang en in VBA.
De 2e kolom is ook niet altijd 0 en 1, kan in principe ook leeg zijn of een decimaal getal.
 

Bijlagen

  • BasisWiskunde.xlsx
    15,5 KB · Weergaven: 23
Laatst bewerkt:
Denk ik nu te simpel?

Code:
=max((a1:a17)*(b1:b17))
 
Matrixformule:
PHP:
=MAX(B2:B18*C2:C18)
 
Laatst bewerkt:
eigenlijk niet te simpel, maar toch een beetje anders
Code:
Sub test()
     With Range("A1").CurrentRegion
          a = .Columns(1).Value
          b = .Columns(2).Value
     End With
     prod = Application.Max(a * b)
End Sub
ik heb dus in VBA een vaste A-array en een B-array die voortdurend wijzigt (in een grote loop, tig keer).
Nu moet ik die 2 met elkaar individueel per rij vermenigvuldigen en het maximum eruit halen.
Voor een stuk of 10 doe je dat in een loopje, maar voor +100.000, toch niet meer, als dat in zo'n simpele instructie zoals de jouwe zou kunnen gaan.
Dus in bovenstaande levert prod = Application.Max(a * b) een fout op, wat is de simpele werkende variant.

Edit : @SNB, ik zit dus al in VBA met arrays bezig en moet met het resultaat verder werken in VBA ...
 
Laatst bewerkt:
Met evaluate moet dat lukken!
 
Dan zou ik arrays gebruiken :p

Code:
Sub M_snb()
   sn = [A2:A18]
   sp = [b2:B18]
   
   For j = 1 To UBound(sn)
     If sn(j, 1) * sp(j, 1) > y Then y = sn(j, 1) * sp(j, 1)
   Next
   
   MsgBox y
End Sub
of
Code:
Sub M_snb()
   sn = [A2:B18]
   
   For j = 1 To UBound(sn)
     If sn(j, 1) * sn(j, 2) > y Then y = sn(j, 1) * sn(j, 2)
   Next
   
   MsgBox y
End Sub
 
Laatst bewerkt:
dus toch zo'n dwaze loop, geen oneliner ?
 
Code:
Sub jec()
 With Range("A2", Range("A" & Rows.Count).End(xlUp))
   MsgBox Evaluate("max((" & .Address & ")*(" & .Offset(, 1).Address & "))")
 End With
End Sub
 
Zo'n lus is vele malen sneller dan een evaluate-funktie.
 
JV, mooi gevonden :thumb: wel bij A1 beginnen

Cow , plaats eens een groot bestand om de snelheid te testen
 
Laatst bewerkt:
@sylv

Is toch hetzelfde als
Code:
msgbox [MAX(A1:A500000*B1:B500000)]
 
Dan is je bereik niet dynamisch.

Zo'n lus is vele malen sneller dan een evaluate-funktie.

Ik denk dat je je daar in vergist. Zon evaluate regel is soms sneller dan een loop. Afhankelijk van de aanwezige functies.
 
@sylv

Gebruik:

Code:
Sub M_snb()
   [A1:B17].AutoFill [A1:B500000]
   sn = [A1:B500000]
   
   For j = 1 To UBound(sn)
     If sn(j, 1) * sn(j, 2) > y Then y = sn(j, 1) * sn(j, 2)
   Next
   
   MsgBox y
End Sub
 
Geen VBA, maar met PQ als extra optie.
 

Bijlagen

  • BasisWiskunde (AC).xlsx
    18,1 KB · Weergaven: 14
ik heb het er gewoon allemaal uitgegooid en ben overniew begonnen, het duurde te lang, dus even tabula rasa
 
Je bent zo duidelijk als het orakel van Delphi (om in klassieke termen te blijven);)
 
Als het gaat om de maximale waarde van een product van 2 matrixen (wat alleen uitgerekend kan worden als het aantal kolommen van de eerste matrix gelijk is aan het aantal rijen van de tweede matrix) dan is in jouw sheet dit wel de juiste formule.
Code:
=MMULT(A1:A17;TRANSPOSE(B1:B17))In dit geval transpose want deze matrix staat verticaal, maar had horizontaal moeten staan.
De maximale waarde van een product van 2 matrixen (is bij gebruik van alleen positieve getallen) gelijk aan
Code:
=MAX(Array1)*MAX(Array2). En dat is in jouw voorbeeld 17*1=17
.Bij gebruik van positieve en negatieve getallen door elkaar heen is de maximale waarde van een product van 2 matrixen gelijk aan
Code:
=MAX(MAX(Array1)*MAX(Array2);MIN(Array1)*MIN(Array2)) Endat is hetzelfde als =MAX(MMULT(Array1;Array2))
In de bijgaande sheet maak ik het één en ander duidelijk.
NB: De bovenstaande formules kloppen alleen indien de eerste matrix 1 kolom is (en de tweede matrix dus 1 rij is). Alleen =MAX(MMULT(Array1;Array2)) klopt altijd.
 

Bijlagen

  • BasisWiskunde HD.xlsx
    12,3 KB · Weergaven: 14
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan