Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Matrix invertieren

Matrix invertieren
19.10.2005 14:19:44
Marc
Hallo Allerseits
Möchte in VB eine Matrix invertieren. Da dies anscheinend nicht möglich ist (ich will nicht das ganze Verfahren programmieren), habe ich versucht, die Daten in Excel zu schieben, dort mit dem Befehl MINV die Matrix zu invertieren und anschliessend mit einem Vektor zu multiplizieren (MMULT). Das ganze habe ich aus dem VB Code gemacht. Nun stellt sich das Problem, dass man bei der Eingabe von MINV beim Abschluss Shift+Ctrl+enter drücken muss, damit das ganze auch funzt (warum es nur mit enter nicht geht, weiss ich auch nicht).
Wenn ich nun aus VB der Befehl MINV aufrufe, kann ich diesen ja nicht mit der genannten Tastenkombination abschliessen!?!? Somit kann die Inverse Matrix nicht erzeugt werden. Ich will die ganze Geschichte vollautomatisch in VBA ablaufen lassen, und auch die benötigten Felder in Excel nach gebrauch wieder löschen.
Hier den Code, den ich verwende:
Range("A51:O65").Select
Selection.FormulaArray = "=MINV(A34:O48)" 'Hier sollte mit Shift+Ctrl+enter abgeschlossen werden!!!
Range("H4:H18").Select
Selection.FormulaArray = "=MMULT(A51:O65,Q51:Q65)"
Hoffentlich kann mir jemand helfen!!!
Gruss
Marc
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Matrix invertieren
19.10.2005 14:28:52
MichaV
Hallo,
in VB geht das nicht, das stimmt. Aber in VBA geht das sehr wohl:

Sub Matrixeln()
Dim a(1 To 2, 1 To 2)
Dim b
Dim c
a(1, 1) = 1
a(1, 2) = -2
a(2, 1) = -1
a(2, 2) = -2
b = Application.WorksheetFunction.MInverse(a)
c = Application.WorksheetFunction.MMult(a, b)
Range("a1:b2") = b
Range("a4:b5") = c
End Sub

Gruss- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Matrix invertieren
19.10.2005 14:51:24
Marc
Hallo Micha
Na das klappt ja prima!! Vielen Dank!
Wollte das ganze nun aber auf mein 15x15 problem umformen.
code:

Sub Matrixeln()
Dim a(1 To 15, 1 To 15)
Dim b
Dim c
Dim i, j As Integer
Dim f(1 To 15)
For i = 1 To 15
For j = 1 To 15
a(i, j) = Cells(1 + i, j)
Next j
Next i
For i = 1 To 15
f(i) = Cells(1 + i, 17)
Next i
b = Application.WorksheetFunction.MInverse(a)
c = Application.WorksheetFunction.MMult(b, f)
Range("a20:a35") = c
End Sub

nun habe ich in der zeile, wo b mit f multipliziert werden, das problem, dass ich unterschiedliche typen habe, was zu einem Laufzeitfehler '1004' führt. wenn ich jedoch bei der Definition der Variablen nur "Dim f" schreibe, dann kann ich die Werte aus den Zellen nicht in f schreiben!?!
Gruss
Marc
Anzeige
AW: Matrix invertieren
19.10.2005 15:01:55
MichaV
Hallo,
ich hab keine Ahnung, was Du da machst, aber so funzt es. Du musst bitte nur gucken, ob das richtige Ergebnis rauskommt ;o)
f muß 2-Dimensional sein. Schreibe
Dim f(1 To 15, 1 To 1)
und weiter unten
f(i, 1) = Cells(1 + i, 17)
Gruss- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Matrix invertieren
19.10.2005 15:07:07
Marc
Sensationell, so geht's!!!!!
Habe mir halt gedacht, dass wenn ich nix angebe, dann sind alle weiteren Dimensionen =1.
Du warst eine grosse Hilfe!
DANKE!!!
Gruss
Marc
AW: Matrix invertieren
19.10.2005 15:10:26
MichaV
Hallo,
bei Worksheet- Functions immer 2 Dimensionen.
Danke für Deine Rückmeldung!
Gruss- Micha
Anzeige
noch was....
19.10.2005 15:15:49
MichaV
Hallo,
anstelle

For i = 1 To 15
For j = 1 To 15
a(i, j) = Cells(1 + i, j)
Next j
Next i

kannst Du auch
dim a
a=range(cells(1,1),cells(15,15)) schreiben.
Wenn die Matrix dann gedreht ist (habs nicht getestet), dann
a=worksheetfunction.transpose(range(cells(1,1),cells(15,15)))
Entsprechend mit f. Um aus einer Spalte eine 2D- Matrix zu bauen, schreibe
f=worksheetfunction.transpose(worksheetfunction.transpose(range("q1:q16")))
Gruss- Micha
Anzeige
AW: noch was....
19.10.2005 15:30:20
Marc
Hmm, wenn das so weiter geht, wird mein Code noch auf eine einzige Bildschirmseite zusammenschrumpfen!!!
Danke für den Tipp!!
Marc
Minimalversion
19.10.2005 15:34:24
MichaV
Hallo,
wieso Seite? Zeile!

Sub Matrixeln()
Range("a20:a34") = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(Range(Cells(1, 1), Cells(15, 15))), Range(Cells(1, 17), Cells(15, 17)))
End Sub

Gruss- Micha
Anzeige
AW: Minimalversion
19.10.2005 16:01:31
Marc
*ggg*
Zum Glück ist noch einiges anderes in meinem Programm vorhanden, die Lösung des Gleichungssystems ist nur ein Teil davon. Ich muss ja schliesslich noch die Koeffizienten der Matrix und des Vektors berechnen. Es handelt sich dabei um die Durchbiegung eines Trägers einer Presse.
Gruss und Danke
Marc
Anzeige
AW: Matrix invertieren
19.10.2005 14:51:36
Marc
Hallo Micha
Na das klappt ja prima!! Vielen Dank!
Wollte das ganze nun aber auf mein 15x15 problem umformen.
code:

Sub Matrixeln()
Dim a(1 To 15, 1 To 15)
Dim b
Dim c
Dim i, j As Integer
Dim f(1 To 15)
For i = 1 To 15
For j = 1 To 15
a(i, j) = Cells(1 + i, j)
Next j
Next i
For i = 1 To 15
f(i) = Cells(1 + i, 17)
Next i
b = Application.WorksheetFunction.MInverse(a)
c = Application.WorksheetFunction.MMult(b, f)
Range("a20:a35") = c
End Sub

nun habe ich in der zeile, wo b mit f multipliziert werden, das problem, dass ich unterschiedliche typen habe, was zu einem Laufzeitfehler '1004' führt. wenn ich jedoch bei der Definition der Variablen nur "Dim f" schreibe, dann kann ich die Werte aus den Zellen nicht in f schreiben!?!
Gruss
Marc
Anzeige
AW: Matrix invertieren
19.10.2005 14:52:02
Marc
Hallo Micha
Na das klappt ja prima!! Vielen Dank!
Wollte das ganze nun aber auf mein 15x15 problem umformen.
code:

Sub Matrixeln()
Dim a(1 To 15, 1 To 15)
Dim b
Dim c
Dim i, j As Integer
Dim f(1 To 15)
For i = 1 To 15
For j = 1 To 15
a(i, j) = Cells(1 + i, j)
Next j
Next i
For i = 1 To 15
f(i) = Cells(1 + i, 17)
Next i
b = Application.WorksheetFunction.MInverse(a)
c = Application.WorksheetFunction.MMult(b, f)
Range("a20:a35") = c
End Sub

nun habe ich in der zeile, wo b mit f multipliziert werden, das problem, dass ich unterschiedliche typen habe, was zu einem Laufzeitfehler '1004' führt. wenn ich jedoch bei der Definition der Variablen nur "Dim f" schreibe, dann kann ich die Werte aus den Zellen nicht in f schreiben!?!
Gruss
Marc
Anzeige
AW: Matrix invertieren
19.10.2005 14:52:05
Marc
Hallo Micha
Na das klappt ja prima!! Vielen Dank!
Wollte das ganze nun aber auf mein 15x15 problem umformen.
code:

Sub Matrixeln()
Dim a(1 To 15, 1 To 15)
Dim b
Dim c
Dim i, j As Integer
Dim f(1 To 15)
For i = 1 To 15
For j = 1 To 15
a(i, j) = Cells(1 + i, j)
Next j
Next i
For i = 1 To 15
f(i) = Cells(1 + i, 17)
Next i
b = Application.WorksheetFunction.MInverse(a)
c = Application.WorksheetFunction.MMult(b, f)
Range("a20:a35") = c
End Sub

nun habe ich in der zeile, wo b mit f multipliziert werden, das problem, dass ich unterschiedliche typen habe, was zu einem Laufzeitfehler '1004' führt. wenn ich jedoch bei der Definition der Variablen nur "Dim f" schreibe, dann kann ich die Werte aus den Zellen nicht in f schreiben!?!
Gruss
Marc
Anzeige
AW: Matrix invertieren
19.10.2005 14:52:18
Marc
Hallo Micha
Na das klappt ja prima!! Vielen Dank!
Wollte das ganze nun aber auf mein 15x15 problem umformen.
code:

Sub Matrixeln()
Dim a(1 To 15, 1 To 15)
Dim b
Dim c
Dim i, j As Integer
Dim f(1 To 15)
For i = 1 To 15
For j = 1 To 15
a(i, j) = Cells(1 + i, j)
Next j
Next i
For i = 1 To 15
f(i) = Cells(1 + i, 17)
Next i
b = Application.WorksheetFunction.MInverse(a)
c = Application.WorksheetFunction.MMult(b, f)
Range("a20:a35") = c
End Sub

nun habe ich in der zeile, wo b mit f multipliziert werden, das problem, dass ich unterschiedliche typen habe, was zu einem Laufzeitfehler '1004' führt. wenn ich jedoch bei der Definition der Variablen nur "Dim f" schreibe, dann kann ich die Werte aus den Zellen nicht in f schreiben!?!
Gruss
Marc
Anzeige
AW: Matrix invertieren
19.10.2005 14:52:22
Marc
Hallo Micha
Na das klappt ja prima!! Vielen Dank!
Wollte das ganze nun aber auf mein 15x15 problem umformen.
code:

Sub Matrixeln()
Dim a(1 To 15, 1 To 15)
Dim b
Dim c
Dim i, j As Integer
Dim f(1 To 15)
For i = 1 To 15
For j = 1 To 15
a(i, j) = Cells(1 + i, j)
Next j
Next i
For i = 1 To 15
f(i) = Cells(1 + i, 17)
Next i
b = Application.WorksheetFunction.MInverse(a)
c = Application.WorksheetFunction.MMult(b, f)
Range("a20:a35") = c
End Sub

nun habe ich in der zeile, wo b mit f multipliziert werden, das problem, dass ich unterschiedliche typen habe, was zu einem Laufzeitfehler '1004' führt. wenn ich jedoch bei der Definition der Variablen nur "Dim f" schreibe, dann kann ich die Werte aus den Zellen nicht in f schreiben!?!
Gruss
Marc
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Matrix invertieren in Excel und VBA


Schritt-für-Schritt-Anleitung

Um eine Matrix in Excel zu invertieren, kannst Du die Funktion MINV verwenden. Die Schritte sind wie folgt:

  1. Daten eingeben: Gib Deine Matrix in einen Bereich ein, z.B. A1:C3 für eine 3x3 Matrix.
  2. Bereich auswählen: Wähle den Bereich aus, in dem die invertierte Matrix angezeigt werden soll.
  3. Formel eingeben: Gib die Formel =MINV(A1:C3) ein.
  4. Mit Strg+Shift+Enter bestätigen: Da es sich um eine Matrixformel handelt, musst Du die Eingabe mit Strg + Shift + Enter abschließen. Dies wird sicherstellen, dass die Formel als Matrixformel interpretiert wird.

Wenn Du die Matrix in VBA invertieren möchtest, kannst Du den Befehl Application.WorksheetFunction.MInverse verwenden. Hier ist ein einfacher Code:

Sub MatrixInvertieren()
    Dim a(1 To 3, 1 To 3) As Double
    Dim b As Variant
    ' Beispielmatrix definieren
    a(1, 1) = 1
    a(1, 2) = 2
    a(1, 3) = 3
    a(2, 1) = 0
    a(2, 2) = 1
    a(2, 3) = 4
    a(3, 1) = 5
    a(3, 2) = 6
    a(3, 3) = 0
    ' Matrix invertieren
    b = Application.WorksheetFunction.MInverse(a)
    ' Invertierte Matrix in das Arbeitsblatt schreiben
    Range("E1:G3").Value = b
End Sub

Häufige Fehler und Lösungen

  • Laufzeitfehler '1004': Dieser Fehler tritt häufig auf, wenn Du versuchst, eine Matrix mit unterschiedlichen Datentypen zu multiplizieren. Stelle sicher, dass die Dimensionen Deiner Matrizen übereinstimmen.

  • MINV funktioniert nicht: Wenn die MINV-Funktion nicht das erwartete Ergebnis liefert, überprüfe, ob Du die Formel korrekt als Matrixformel eingegeben hast (mit Strg + Shift + Enter).

  • Typeninkompatibilität: Achte darauf, dass die Arrays, die Du in VBA verwendest, die richtigen Dimensionen haben. Wenn Du versuchst, einen Vektor in eine Matrix einzufügen, könnte dies Probleme verursachen.


Alternative Methoden

Neben der Verwendung von MINV in Excel gibt es auch andere Ansätze:

  • VBA Matrix Inversion: Nutze die Application.WorksheetFunction.MInverse-Methode, um die Inversion direkt im VBA-Code durchzuführen, ohne die Daten in Excel zu übertragen.

  • TRANSPOSE-Funktion: Du kannst die TRANSPOSE-Funktion verwenden, um eine Matrix umzukehren, was in einigen Fällen hilfreich sein kann.


Praktische Beispiele

Hier ist ein praktisches Beispiel für die Inversion einer 4x4 Matrix in Excel:

=MINV(A1:D4)

In VBA, um eine 15x15 Matrix zu invertieren, könntest Du den folgenden Code verwenden:

Sub Matrix15x15Invertieren()
    Dim a(1 To 15, 1 To 15) As Double
    Dim b As Variant
    Dim i As Integer, j As Integer

    ' Matrix mit Werten füllen
    For i = 1 To 15
        For j = 1 To 15
            a(i, j) = Cells(i, j).Value
        Next j
    Next i

    ' Matrix invertieren
    b = Application.WorksheetFunction.MInverse(a)
    ' Invertierte Matrix speichern
    Range("A18:O32").Value = b
End Sub

Tipps für Profis

  • Verwende Named Ranges: Um die Lesbarkeit Deines Codes zu verbessern, kannst Du benannte Bereiche verwenden, wenn Du mit großen Matrizen arbeitest.

  • Fehlerbehandlung in VBA: Implementiere Fehlerbehandlungsroutinen in Deinem VBA-Code, um mögliche Laufzeitfehler abzufangen und zu behandeln.

  • Matrixdimensionen überprüfen: Vor der Durchführung von Matrixoperationen solltest Du sicherstellen, dass die Dimensionen der Matrizen kompatibel sind, um Fehler zu vermeiden.


FAQ: Häufige Fragen

1. Wie invertiere ich eine Matrix in Excel?
Du kannst die MINV-Funktion verwenden und die Eingabe mit Strg + Shift + Enter abschließen, um die invertierte Matrix anzuzeigen.

2. Was ist die maximale Größe einer Matrix, die ich in Excel invertieren kann?
Excel hat Einschränkungen in Bezug auf die Anzahl der Zeilen und Spalten in einem Arbeitsblatt. In der Regel sind 15x15 oder 16x16 Matrizen problemlos handhabbar.

3. Was tun, wenn die Matrix nicht invertierbar ist?
Eine Matrix ist nicht invertierbar, wenn sie singulär ist (d.h. ihre Determinante ist 0). Überprüfe die Matrixwerte und stelle sicher, dass sie invertierbar ist.

4. Wie kann ich eine Matrix in VBA invertieren?
Verwende den Befehl Application.WorksheetFunction.MInverse, um die Matrix zu invertieren und speichere das Ergebnis in einem Variant-Array.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige