主子矩阵与上三角矩阵。(Haskell相关)


#1

这里的trimult是一种当xss是上三角矩阵,yss是任意矩阵时的乘法,不过由于没学过Haskell,有点看不懂,有没有人用数学的语言描述一下。。。

P.S. transpose是转置吧(话说zip就能转置吧)?submats是主子矩阵。


说一下我没看懂的地方:

trimult里的zipWith除了一个函数参数还有两个提供数据的参数吧,可是一个是上三角矩阵,一个是主子矩阵的集合(应该是吧?),这样,在执行(map . dp)时不会让dp左右参数类型不一致,然后dp不起来么?


#2

瞄过几页《趣学 hs》,现在全忘了。

感觉是 map 会出错吧?dp 是可以过的


#3

不会,把类型写出来就能看出来了

import Data.List (transpose)

-- Data.List transpose :: [[a]] -> [[a]]

-- The name itself docent matter
type Tri = [[Integer]] -- Initialize with a concrete type since Haskell doesn't support Impredicative polymorphism

trimult :: Tri -> Tri -> Tri
trimult xss yss = (zipWith (map . dp) :: Tri -> [Tri] -> Tri)
                  (xss :: Tri)
                  (submats ((transpose yss) :: Tri) :: [Tri])

submats :: Tri -> [Tri]
submats = undefined

dp :: Num a => [a] -> [a] -> a
dp = undefined

#4

是不是mapdp xsmapyss


#5

不是。你不会沒注意到 mapdp 之間有个 compose (.) 吧。

dp :: Num a => [a] -> ([a] -> a)
map :: (a -> b) -> ([a] -> [b])
(.) :: (b -> c) -> (a -> b) -> (a -> c)
map . dp :: Num a => [a] -> ([[a]] -> [a])

#6

喔,也就是函数得到一个参数后变成另一个函数,另一个函数的类型就是剩下的。

map . dp的效果是分别把每一行和后面的每个主子矩阵相乘?这应该单纯是因为前面的元素是0吧?

它这样表示的话Tri作为矩阵每行前的0省略了?


#7

噢,看到 (.) 我想当然地认为是这样调用的:

(f2 . f1) x y

然后展开为:

(f2 (f1 x y))

:sweat_smile:


#8

他的上三角矩阵是处理过的

> upper [[1,2,3],[0,4,5],[0,0,6]]
[[1,2,3],[4,5],[6]]