Vektor-Matrixprodukt ohne numpy

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
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

ich versuche eine Funktion zu programmieren die:
- das Skalarprodukt von A und B ausgibt, falls A und B Vektoren passender Dimension sind sowie
- das Vektor-Matrixprodukt von A und B ausgeben, falls A eine Matrix und B ein Vektor passender Dimension sind.

Das alles OHNE numpy und so

das mit dem skalarprodukt von 2 Vektoren hab ich geschafft... aber das mit dem Vektor matrix-produkt ist find ich schwer.
ausserdem habe ich eine "negiere" Funktion definiert die einen Vektor als auch eine Matrix "negiert" also jeden Eintrag mit -1 multipliziert

mein Programm sieht soweit so aus:

Code: Alles auswählen

vec = [2,2,2]
matrix = [[3,3,3], [3,3,3]]
   
def negiere(liste):
    if isinstance(liste[0], list):
        return [negiere(item) for item in liste]
    liste = [-x for x in liste]
    return liste

def product(a,b):
    jj = sum(a[x]*b[x] for x in range(len(b))) #Vektorprodukt
    
    if isinstance(a[0], list) or isinstance(b[0], list): # passt diese Überprüfung ? ob eins der beiden eine liste enthält? 
                                                                          # also ob eins der beiden eine matrix ist?
    #hier sollte das vektor-matrixprodukt stehen

print negiere(matrix)
#print product(vec,matrix)
versuche schon seit tagen das selbst zu lösen! komme aber wirklich nicht darauf.
ich weiss zwar wie ich auf die einzelnen Einträge der matrix komme
einfach mit 2 for schleifen...
aber wie mache ich da das skalarprodukt von einer liste(Vektor), mit einer liste -in einer liste (matrix)

es sollte also bei dem
gegebenen Vektor =[ 2,2,2] und
gegebener Matrix =[ [3,3,3], [3,3,3] ]

hier muss man ein skalarprodukt von den listen anwenden:

Produkt = (2*3 + 2*3 + 2*3) ; (2*3 + 2*3 + 2*3) = [18, 18]
Zuletzt geändert von Anonymous am Montag 6. April 2015, 17:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@jjonson123: glaubst Du ein zweiter Thread zum selben Thema macht Dich irgendwie schlauer?
Wie ich schon im anderen Thread geschrieben habe funktioniert das berechnen von jj nur, wenn a und b Vektoren sind. Also kannst Du das ja nicht als erstes in Deiner Funktion machen, vor der Prüfung zwei Zeilen später. Die if-Abfrage hilft Dir ja auch nicht weiter, weil Du ja für jeden Fall a Matrix und b Vektor, a Vektor und b Matrix, ... eine eigene Produkt-Berechnung brauchst.

Über den Index einer Liste zu iterieren ist in Python ein Antipattern. Will man mehrere Listen gleichzeitig durchlaufen, gibt es dafür die zip-Funktion:

Code: Alles auswählen

jj = sum(x*y for x,y in zip(a,b))
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

Code: Alles auswählen

vector = [2,2,2]
matrix = [[3,3,3],[3,3,3]]

jj = sum(x*y for x,y in zip(vector,matrix))

print jj
hierbei kommt nicht das Vektor-Matrixprodukt raus!
oder habe ich das irgendwie falsch verstanden?
ich kriege diese fehlermeldung:
unsupported operand type(s) for +: 'int' and 'list'
ich verstehe das so:
wenn man "zip(vector,matrix)" anwendet kommt raus: [(2, [3, 3, 3]), (2, [3, 3, 3])]
und man kann bei int nicht mit list nicht operieren ?

wie operiert man da das Vektor-matrixprodukt also damit da [18, 18] rauskommt? bin echt verwirrt sorry :/
Zuletzt geändert von Anonymous am Montag 6. April 2015, 17:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@jjonson123: jetzt bist Du schon einen Schritt weiter. Du hast gemerkt, dass so wie Du das machst, es nicht funktioniert. Nimm Dir einen Zettel und Bleistift und gehe Schritt für Schritt durch, wie Du das Produkt zwischen Vektor und Matrix ausrechnen würdest. Dann versuch es dem Computer beizubringen. Fürs erste für den Spezialfall 2x3-Matrix. Wenn Du es soweit hast, versuche das zu verallgemeinern.
Antworten