matrixmultiplikation

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
Jennyg
User
Beiträge: 4
Registriert: Dienstag 24. Januar 2023, 14:26

Ich habe ein problem mit meiner Aufgabe. Es soll eine Funktion geschrieben werden die eine matrix mit einem vektor multipliziert. dieser hinweis wurde uns noch gegeben Hinweis: Die Matrizen müssen nicht unbedingt quadratisch sein. Sie können aber bei den Eingaben davon ausgehen, dass alle Spalten/Zeilen innerhalb einer Matrix dieselbe Länge haben. Um eine Matrix oder einen Vektor zu kopieren, können Sie z.B. für eine gegebene Matrix X eine Kopie mithilfe von Y = X.copy() erstellen.

mein code sieht bis jetzt so aus :

Code: Alles auswählen

def mult_matrix_vector(A, b):
    """
    returns the product of matrix A and vector x
    Parameter A: a list of lists, representing the column vectors of A
    Precondition: A is a list of lists of floats
    Parameter x: the vector x
    Precondition: x is a list of floats
    """
    
    assert(len(A)==len(b))
    r=[]
    
    for j in range(len(b)):
        sum = 0
        
        for i in range(len(b)):
            sum = sum + A [i] [j] * b [i]
            
        r.append(sum)
        
    return r
Zum prüfen wurde uns das gegeben

mult_matrix_vector( [ [1,2,3],[1,2,3] ] ,[ 4,5 ] ) == [ 9, 18, 27 ]

aber mit meinem code bekomme ich nur [ 9, 18 ]
könnte mir jemand weiterhelfen?
__deets__
User
Beiträge: 13176
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du behandelst die matrix als quadratisch. Das ist sie aber nicht. len(A) bet immer die Anzahl der Spalten. Für die anzahl der Zeilen isst du die Länge ei er Spalte bestimmen. Zb der ersten.
Jennyg
User
Beiträge: 4
Registriert: Dienstag 24. Januar 2023, 14:26

__deets__ hat geschrieben: Dienstag 24. Januar 2023, 16:43 Du behandelst die matrix als quadratisch. Das ist sie aber nicht. len(A) bet immer die Anzahl der Spalten. Für die anzahl der Zeilen isst du die Länge ei er Spalte bestimmen. Zb der ersten.
Habe das Problem gefunden, Dankeschön
Benutzeravatar
__blackjack__
User
Beiträge: 11588
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jennyg: ``assert`` würde ich für den Test nicht verwenden. Das ist eher was um Bedingungen zu testen die innerhalb einer Funktion/Methode immer gelten müssen, nicht um Werte von aussen zu prüfen, auf die man in der Funktion/Methode keinen Einfluss hat.

`A`, `b`, und `r` sind schlechte Namen, weil die nichts darüber aussagen was diese Werte im Kontext des Programms bedeuten. Zudem wäre `A` von der Schreibweise eine Konstante, was bei Argumenten keinen Sinn macht.

Die Dokumentation behauptet das `b` eigentlich `x` heissen würde.

`sum` ist der Name einer eingebauten Funktion, den sollte man nicht an etwas anderes binden. Insbesondere wo man diese Funktion hier sogar gebrauchen kann. Denn:

Code: Alles auswählen

    result = []
    for j in range(len(vector)):
        sum = 0
        for i in range(len(vector)):
            sum += matrix[i][j] * vector[i]
        result.append(sum)
    
    return result
    
    # =>
    
    result = []
    for j in range(len(vector)):
        result.append(
            sum(matrix[i][j] * vector[i] for i in range(len(vector)))
        )
    
    return result
    
    # =>
    
    return [
        sum(matrix[i][j] * vector[i] for i in range(len(vector)))
        for j in range(len(vector))
    ]
Ist jetzt noch der Originalcode mit Fehler, aber auch die Korrektur sollte man als „list comprehension“ ausdrücken können.
“The gods of the Disc have never bothered much about judging the souls of the dead, and so people only go to hell if that's where they think they deserve to go. Which they won't do if they don't know about it. This explains why it is important to shoot missionaries on sight.” -Terry Pratchett, Eric
Jennyg
User
Beiträge: 4
Registriert: Dienstag 24. Januar 2023, 14:26

__blackjack__ hat geschrieben: Dienstag 24. Januar 2023, 19:01 @Jennyg: ``assert`` würde ich für den Test nicht verwenden. Das ist eher was um Bedingungen zu testen die innerhalb einer Funktion/Methode immer gelten müssen, nicht um Werte von aussen zu prüfen, auf die man in der Funktion/Methode keinen Einfluss hat.

`A`, `b`, und `r` sind schlechte Namen, weil die nichts darüber aussagen was diese Werte im Kontext des Programms bedeuten. Zudem wäre `A` von der Schreibweise eine Konstante, was bei Argumenten keinen Sinn macht.

Die Dokumentation behauptet das `b` eigentlich `x` heissen würde.

`sum` ist der Name einer eingebauten Funktion, den sollte man nicht an etwas anderes binden. Insbesondere wo man diese Funktion hier sogar gebrauchen kann. Denn:

Code: Alles auswählen

    result = []
    for j in range(len(vector)):
        sum = 0
        for i in range(len(vector)):
            sum += matrix[i][j] * vector[i]
        result.append(sum)
    
    return result
    
    # =>
    
    result = []
    for j in range(len(vector)):
        result.append(
            sum(matrix[i][j] * vector[i] for i in range(len(vector)))
        )
    
    return result
    
    # =>
    
    return [
        sum(matrix[i][j] * vector[i] for i in range(len(vector)))
        for j in range(len(vector))
    ]
Ist jetzt noch der Originalcode mit Fehler, aber auch die Korrektur sollte man als „list comprehension“ ausdrücken können.
Die Aufgabe die uns gegeben wurde lautet:
b) Schreiben Sie eine Funktion mult_matrix_vector(A,b), die die Matrix A mit dem Vektor b multipliziert. Überprüfen Sie auch hier zuerst die Dimensionen mittels assert und geben im Fehlerfall eine entsprechende Meldung aus.

also leider kann ich 'A' und 'b' nicht ändern und auch assert soll ich verwenden(die Fehlermeldung von meinem assert habe ich noch hinzugefügt).
Aber 'r' und 'sum' werde ich noch anders benennen. Dankeschön
Sirius3
User
Beiträge: 16866
Registriert: Sonntag 21. Oktober 2012, 17:20

`r` ist aber nicht vorgegeben, und auch A und b kann man einfach innerhalb der Funktion in sinnvolle Namen übersetzen, dass wenigstens dort der Code gut lesbar ist. Ist der Doc-String auch so vorgegeben, denn dort ist von einem Vektor x die Rede?
`assert` ist trotzdem keine Funktion, die Klammerung deshalb sehr verwirrend.

Code: Alles auswählen

def mult_matrix_vector(A, b):
    """
    returns the product of matrix A and vector x
    Parameter A: a list of lists, representing the column vectors of A
    Precondition: A is a list of lists of floats
    Parameter x: the vector x
    Precondition: x is a list of floats
    """
    matrix, vector = A, b
    # TODO: should be a ValueError
    assert len(matrix) == len(vector)
    return [
        sum(matrix[i][j] * vector[i] for i in range(len(vector)))
        for j in range(len(vector))
    ]
Jennyg
User
Beiträge: 4
Registriert: Dienstag 24. Januar 2023, 14:26

Sirius3 hat geschrieben: Mittwoch 25. Januar 2023, 08:45 `r` ist aber nicht vorgegeben, und auch A und b kann man einfach innerhalb der Funktion in sinnvolle Namen übersetzen, dass wenigstens dort der Code gut lesbar ist. Ist der Doc-String auch so vorgegeben, denn dort ist von einem Vektor x die Rede?
`assert` ist trotzdem keine Funktion, die Klammerung deshalb sehr verwirrend.

Code: Alles auswählen

def mult_matrix_vector(A, b):
    """
    returns the product of matrix A and vector x
    Parameter A: a list of lists, representing the column vectors of A
    Precondition: A is a list of lists of floats
    Parameter x: the vector x
    Precondition: x is a list of floats
    """
    matrix, vector = A, b
    # TODO: should be a ValueError
    assert len(matrix) == len(vector)
    return [
        sum(matrix[i][j] * vector[i] for i in range(len(vector)))
        for j in range(len(vector))
    ]
Die Klammer habe ich noch entfernt und auch x noch geändert, den Doc-string hatte ich aus der Vorlesung übernommen deshalb war ein x
Antworten