Gepostet: |
Addieren von zwei Matrizen | ||||||||||
Hallo hab wieder mal ein Problem. Also....wir sollen 2 Matrizen addieren und toList und toTupel waren schon vorgegeben. Die Funktion madd habe ich programmiert, aber wenn ich das Programm starte kommt die Fehlermeldung unexpected '=' und ich weiß nicht warum. Also entweder ist in meinem Programm eine Zeile oder alles flasch und das weiß ich eben nicht.. Ach ja und hier das Programm: -- Aufruf madd ([],1,1) ([],1,1) -- muss f¸r die Abgabe ¸ber LEHVIS funktionieren type SpareMatrix = ([(Int,Int,Int)],Int,Int) toList :: SpareMatrix -> [[Int]] toList (l,zeilen,spalten) = toMatrix l zeilen spalten 0 where toMatrix l maxz maxs z | maxz == z = [] | otherwise = (toRow l maxs z 0):toMatrix l maxz maxs (z+1) where toRow l maxs z s | maxs == s = [] | otherwise = (getElem (z,s) l):toRow l maxs z (s+1) where getElem _ [] = 0 getElem (zeile,spalte) ((z,s,value):r) | zeile == z && spalte == s = value | otherwise = getElem (zeile,spalte) r toTupel :: [[Int]] -> SpareMatrix toTupel l = (toSpareMatrix l zeilen spalten 0 0,zeilen,spalten) where zeilen = length l spalten = length (head l) toSpareMatrix [] _ _ _ _ = [] toSpareMatrix (a:r) maxz maxs z s | s == maxs = toSpareMatrix r maxz maxs (z+1) 0 | a!!s == 0 = toSpareMatrix (a:r) maxz maxs z (s+1) | otherwise = (z,s,a!!s):toSpareMatrix (a:r) maxz maxs z (s+1) madd :: SpareMatrix -> SpareMatrix -> Sparematrix madd (((z1:s1:n1):xs),zeile1,spalte1) (((z2:s2:n2):ys),zeile2,spalte2) | zeile1==zeile2 && spalte1==spalte2 = toTupel m1m2 where m1m2 = zipWith (+) m1 m2 where m1 = toList (((z1:s1:n1):xs),zeile1,spalte1) m2 = toList (((z2:s2:n2):ys),zeile2,spalte2) | otherwise = error "Matricen müssen gleich grofl sein" |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo, in der Funktion madd sollten die where-Deklarationen hinter die zweite Fallunterscheidung: madd ... Und das zweite where ist nicht notwendig, du kannst in einem where beliebig viele Defnitionen angeben. PS: Benutze nächstes mal bitte die [ code ]-Tags, dann sieht man auch bei der Einrückung im Quelltext besser durch. Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
und wie würde sich das Programm verändern, wenn ich 2 Matrizen multiplizieren möchte? | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Tja, das ist etwas komplizierter. ;-) Man könnte zunächst die zweite Matrix transponieren und dann immer eine Zeile der ersten Matrix mit allen Zeilen der zweiten Matrix bearbeiten, also immer das Vektorprodukt berechnen und alle entstehenden Werte als Zeile in die Ergebnismatrix übernehmen. | |||||||||||
Zum Seitenanfang | |||||||||||