Herbers Excel-Forum - das Archiv

Function & MMult

Bild

Betrifft: Function & MMult
von: Willphisto

Geschrieben am: 29.12.2006 18:11:28
Hallo,
vorweg mal Danke für Eure Hilfe!!! Nun zu meinem Problem. Ich hab eine Rechnung ( Matrix * Vektor ) = Vektor ) der Form...
https://www.herber.de/bbs/user/39248.xls
In einem sub Programm bestimme ich den vektor a,b,c indem ich
Dim abc
Dim matrix(1 To 3, 1 To 3)
Dim vek_t
Dim vek(1 To 3)
Dim inv_m
vek_t = WorksheetFunction.Transpose(vek)
inv_m = Application.WorksheetFunction.MInverse(matrix)
abc = Application.WorksheetFunction.MMult(inv_m, vek_t)
mache. Das klappt auch ganz gut. Ich krieg dann 3 Zahlen raus die stimmen ( Sollten :-) ). Jetzt bräuchte ich das ganze aber in Form einer Function, bei der mir der Vektor abc also wirklicher Vektor ausgegeben wird, d.h. abc(2). Bei mir kommt da immer " Zuweisung an Datenfeld nicht möglich" ...
Hoffe es hat einer eine Idee..
Vielen Dank
Bild

Betrifft: AW: Function & MMult
von: ingUR

Geschrieben am: 29.12.2006 23:44:41
Hallo, @Willphisto,
Deine Fragestellung läßt offen, ob Du eine Tabellenfunktion oder eine VBA-interne Funktion erstellen möchtes, die ausgabe also in Zellen erfolgen soll oder aber als Rückgabewert.
Zudem wäre es für einen Antwortenden leichter, wenn er sich auf Deine bisherigen Ausarbeitungen beziehen könnte, denn zumindest bei mir will die Befehlsfolge nicht klappen. Also bitte das Makro hochladen, das biher "ganz gut klappt".
Sofern ein Vektor aus einer Funktion zurückgegeben werden soll, gäbe es die Möglichkeit, das Vektorfeld in der Aufrufparameterliste By Ref zu übergeben (ob als Rückgabewert einer Funktion ein Array möglich ist, habe ich in VB noch nicht geprüft; vermute dass es nicht geht, da keine Zeiger als Rückgabewert einsetzbar sind):
Pseudocode:
'Aufrufprogammteil:
sub Main()
Dim M1(1 to 3,1 to 3), v1(3)
Dim resV(ubound(M1))
'...Werte für M1 und v1 setzen
'Funktionsaufruf und auswerung des Rückgabewerts
if MVektor(M1, v1, resV) then
'gültiger Vektor
else
'Fehler bei Vektorermittlung
end if
end sub
Function MVektor( M1(), v1(), By Ref resV()) as boolean
MVektor = true
On Error Goto Fehlerausstieg
for i= 1 to ubound(resV)
resV(i) = SUMMENPRODUKT(M(r)*v1)
next i
exit function
Fehlerausstieg:
MVektor=false
end function
Andes würde es aussehen, wenn man die Ergebnisse in einen Zllenbereich übertagen möchte.
Gruß,
Uwe

Bild

Betrifft: AW: Function & MMult
von: Luc:-?

Geschrieben am: 30.12.2006 12:56:15
Hallo Uwe & Wilphisto,
Felder sind als Rückgabewert einer (ud)Fkt durchaus möglich (Typ Variant). Das Problem scheint mir darin zu bestehen, dass das Feld bereits fix und fertig dimensioniert ist und dann die Zuweisung erfolgt. Das erzeugt in aller Regel die beschriebene Fehlermeldung. In solchen Fällen verwendet man deshalb eine (undimensionierte Feld-)Variable (vom Typ Variant). Also...
Dim Variable() As ... bzw Dim Variable As Variant.
Erstere kann man redimmen (ReDim Variable As ...) und schrittweise füllen, Letztere kann jeden beliebigen Inhalt (also auch Felder) durch Variable=... erhalten.
Guten Rutsch!
Luc :-?
Bild

Betrifft: AW: Function & MMult
von: ingUR

Geschrieben am: 30.12.2006 16:47:30
Danke, @Luc:-?,
für den Hinweis. Damit kann also folgende Grundfunktion geschrieben werden:
Sub ....
Dim abc
'Aufruf aus Hauptprogramm
abc = resv(matrix(), vek())
End Sub
Function resv(matrix(), vek()) As Variant
Dim temv() As Variant
Dim r As Integer, s As Integer
ReDim tempv(UBound(matrix))
For r = 1 To UBound(vek)
For s = 1 To UBound(matrix)
tempv(r) = tempv(r) + matrix(r, s) * vek(s)
Next s
Next r
resv = tempv
End Function
Doch wozu diese Aktion von nutzen ist, wird @Willphisto entscheiden müssen, denn in abc wird doch ebenso ein Vektor geschrieben ( a(1,1),a(2,1), a(3,1) ). Allerdings wird mit der Funktion nun tatsächlich abc(1), abc(2), ... abc(i), ... abc(Ubound(matrix) angelegt und gefüllt.
Gruß,
Uwe
Bild

Betrifft: Bitte, gern geschehen! Gruß - owT
von: Luc:-?
Geschrieben am: 30.12.2006 18:44:48
:-?
 Bild