Matrix aus Matrizen erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hukd321
User
Beiträge: 12
Registriert: Dienstag 31. Juli 2012, 16:07

Hey Forenkolleginnen und -kollegen,

ich arbeite seit kurzem mit Python und stehe nun vor dem ersten Problemchen, welches weder stackoverflow noch google lösen konnten.
Daher habe ich mich hier angemeldet, in der Hoffnung, hier Hilfe zu bekommen.

Eigentlich ist es relativ simpel:
Ich habe eine (b x b) Matrix H eine (a x b) Matrix E und eine (a x a) Nullmatrix O

jetzt will ich eine ( (b+a) x (b+a) )G Matrix erstellen, die so aufgebaut ist:
G = ([H , -E.T], [-E, O])


Meine beiden naiven Ansätze sind folgende:

Code: Alles auswählen

G = array([H, -E.T], [-E, O])
=> liefert Fehler: TypeError: data type not understood

bzw.

Code: Alles auswählen

G = array([[H, -E.T], [-E, O]])
=> liefert Fehler: ValueError: setting an array element with a sequence.


Wie realisiere ich das? numpy ist natürlich importiert, die Matrizen sind alle nicht über die eigene Matrix-Klasse, sondern über die array-Klasse initialisiert!

ich muss des weiteren auch einen Vektor v erstellen, der aus dem Inversen der G Matrix, einem b-dimensionalen Eins-Vektor und einem a-dimensionalen Null-Vektor. Für diesen gilt:
v = G^(-1) * (EinsvektorB, NullvektorA)

Ich hab es so versucht (da ich G ja schon gar nicht hinbekomme, weiß ich nicht, ob das hier auch eine exception wirft):

Code: Alles auswählen

v = dot(inv(G), array(EinsvektorB, NullvektorA))
(EinsvektorB und NullvektorA habe ich initialisiert... geht bestimmt auch eleganter, ich weiß)


Vielen Dank für eure Hilfe!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!
hukd321 hat geschrieben:jetzt will ich eine ( (b+a) x (b+a) )G Matrix erstellen, die so aufgebaut ist:
G = ([H , -E.T], [-E, O])
``np.concatenate`` hilft dir hier weiter. Vielleicht gibt es für diesen Fall noch etwas geschickteres.

Code: Alles auswählen

>>> import numpy as np
>>> a = np.matrix([[1,2],[3,4]])
>>> b = np.matrix([[5,6],[7,8]])
>>> np.concatenate((a, b))
matrix([[1, 2],
        [3, 4],
        [5, 6],
        [7, 8]])
>>> np.concatenate((a, b), 1)
matrix([[1, 2, 5, 6],
        [3, 4, 7, 8]])
hukd321 hat geschrieben:numpy ist natürlich importiert, die Matrizen sind alle nicht über die eigene Matrix-Klasse, sondern über die array-Klasse initialisiert!
Da stellt man sich natürlich die Frage, warum du so etwas machst und warum du numpy nicht nutzt? Nur mittels eines Imports is ja noch kein Problem gelöst. Vielleicht solltest du dich erstmal vernünftig in die Grundlagen von numpy einarbeiten. So viel ist das eigentlich nicht.
hukd321 hat geschrieben:Ich hab es so versucht (da ich G ja schon gar nicht hinbekomme, weiß ich nicht, ob das hier auch eine exception wirft):

Code: Alles auswählen

v = dot(inv(G), array(EinsvektorB, NullvektorA))
Warum kümmerst du dich um ein Problem, welches eigentlich noch gar nicht existiert? ^^ dot ist hier natürlich falsch, du willst doch einfach nur eine Matrix mit einer anderen multiplizieren, da reich ein ganz normales *.

Dieser Link könnte für dich vielleicht noch ganz hilfreich sein. Unten sind einige Beispiele zu den wichtigesten Operationen.

Sebastian
Das Leben ist wie ein Tennisball.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hast du mal versucht für die Matrizen auch die Matrix Klasse zuverwenden [1]. Ich hatte auch schon einige Probleme mit der array Klasse, weil dort manche Operationen eben auf arrays definiert sind und nicht auf Matrizen.



[1] http://docs.scipy.org/doc/numpy/referen ... atrix.html
hukd321
User
Beiträge: 12
Registriert: Dienstag 31. Juli 2012, 16:07

habs so hinbekommen:

Code: Alles auswählen

G = vstack((hstack((H, -E.T)), hstack((-E, O))))
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Variante sieht in der Tat recht hübsch und kompakt aus, besonders wenn man mehr als zwei Matrizen pro Spalte/Zeile hat. Du solltest dir aber die *-Importe abgewöhnen, sonst weißt du nicht mehr aus welchem Modul die Namen kommen. Eigentlich hat sich überal ``import numpy as np`` durchgesetzt. Großer Nutzen mit quasi keinem Overhead.
Das Leben ist wie ein Tennisball.
hukd321
User
Beiträge: 12
Registriert: Dienstag 31. Juli 2012, 16:07

okay, danke für die hilfe und den hilfreichen link :)
Antworten