我正在编写自己的矩阵模块以供娱乐和练习(时间和空间复杂度无关紧要)。现在我想实现矩阵乘法,我正在努力解决它。这可能是我使用 Haskell 的原因,但我没有太多经验。这是我的数据类型:
data Matrix a =
M {
rows::Int,
cols::Int,
values::[a]
}
它将这样的 3x2 矩阵存储在数组中:
1 2
3 4
5 6
= [1,2,3,4,5,6]
我有一个有点工作的转置功能
transpose::(Matrix a)->(Matrix a)
transpose (M rows cols values) = M cols rows (aux values 0 0 [])
where
aux::[a]->Int->Int->[a]->[a]
aux values row col transposed
| cols > col =
if rows > row then
aux values (row+1) col (transposed ++ [valueAtIndex (M rows cols values) (row,col)])
else aux values 0 (col+1) transposed
| otherwise = transposed
要索引数组中的元素,我正在使用这个函数
valueAtIndex::(Matrix a)->(Int, Int)->a
valueAtIndex (M rows cols values) (row, col)
| rows <= row || cols <= col = error "indices too large for given Matrix"
| otherwise = values !! (cols * row + col)
据我了解,我必须为 m1: 2x3 和 m2: 3x2 获取这样的元素
m1(0,0)*m2(0,0)+m1(0,1)*m2(0,1)+m1(0,2)*m2(0,2)
m1(0,0)*m2(1,0)+m1(0,1)*m2(1,1)+m1(0,2)*m2(1,2)
m1(1,0)*m2(0,0)+m1(1,1)*m2(0,1)+m1(1,2)*m2(0,2)
m1(1,0)*m2(1,0)+m1(1,1)*m2(1,1)+m1(1,2)*m2(2,2)
现在我需要一个函数,它需要两个矩阵,rows m1 == cols m2
然后以某种方式递归计算正确的矩阵。
multiplyMatrix::Num a=>(Matrix a)->(Matrix a)->(Matrix a)