Seite 1 von 1

matrixmultiplikation

Verfasst: Dienstag 24. Januar 2023, 14:42
von Jennyg
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?

Re: matrixmultiplikation

Verfasst: Dienstag 24. Januar 2023, 16:43
von __deets__
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.

Re: matrixmultiplikation

Verfasst: Dienstag 24. Januar 2023, 18:44
von Jennyg
__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

Re: matrixmultiplikation

Verfasst: Dienstag 24. Januar 2023, 19:01
von __blackjack__
@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.

Re: matrixmultiplikation

Verfasst: Mittwoch 25. Januar 2023, 00:26
von Jennyg
__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

Re: matrixmultiplikation

Verfasst: Mittwoch 25. Januar 2023, 08:45
von Sirius3
`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))
    ]

Re: matrixmultiplikation

Verfasst: Mittwoch 25. Januar 2023, 16:07
von Jennyg
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