www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

chrisslater

Gepostet:
21.11.2008 21:45

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    
 
Siracusa

Gepostet:
21.11.2008 22:52

   
Hallo,

in der Funktion madd sollten die where-Deklarationen hinter die zweite Fallunterscheidung:
madd ...
| ... = ...
| ... = ... where
...

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    
 
chrisslater

Gepostet:
21.11.2008 23:17

   
und wie würde sich das Programm verändern, wenn ich 2 Matrizen multiplizieren möchte?
Zum Seitenanfang    
 
Siracusa

Gepostet:
22.11.2008 01:22

   
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