Haskell 哈斯克尔';s的床和早餐矩阵乘法错了吗?

Haskell 哈斯克尔';s的床和早餐矩阵乘法错了吗?,haskell,matrix,linear-algebra,Haskell,Matrix,Linear Algebra,Haskell的床和早餐图书馆是年线性代数部分的第一个图书馆。 所以,我试着: let a = Matrix.fromList [[1,2,3], [4,5,6], [7,8,9]] let b = Matrix.fromList [[1], [2], [3]] a * b *** Exception: Matrix.times: `numRows a' and `numCols b' don't match. 沃特?如果我用[m x n]矩阵乘以[n x p]矩阵,我应该得到[m x p]矩

Haskell的床和早餐图书馆是年线性代数部分的第一个图书馆。 所以,我试着:

let a = Matrix.fromList [[1,2,3], [4,5,6], [7,8,9]]
let b = Matrix.fromList [[1], [2], [3]]
a * b
*** Exception: Matrix.times: `numRows a' and `numCols b' don't match.
沃特?如果我用[m x n]矩阵乘以[n x p]矩阵,我应该得到[m x p]矩阵,而不是这个愚蠢的例外。好吧,也许图书馆的作者不知道哪里是左,哪里是右

b * a
 *** Exception: Ix{Int}.index: Index (2) out of range ((1,1))
哇啊?

我看了看桌子

最里面的列表表示行。此函数将创建一个m-n矩阵,其中m是行数,是行列表的最小长度,n是列数,即外部列表的长度

这是。。。很难解析,但这意味着
[[1]、[2]、[3]]
是一个1x3矩阵,而不是3x1矩阵。这与列数等于外部列表长度的断言相匹配——这当然意味着每个内部列表本身就是一列

使用短语“行主要顺序”会使事情更清楚。作为参考,Fortran主要是行,C主要是列。大多数线性代数软件包似乎遵循Fortran约定,因此在这方面,《床与早餐》库是相当正常的


至于例外。。。听起来像个bug?

我敢打赌,您使用的是一款全新的GHC;结果,阴谋集团选择了一种老式的《床与早餐》。在我的机器上,它选择了版本0.1.2(即使最新版本是0.4.3);此版本似乎具有以下功能:

a`times`b
|numRows a/=numCols b=error“矩阵。时间:`numRows a'和`numCols b'不匹配。”
|否则=fromList[[行i a`dotProd`col j b

|j好的,谢谢。但是
[[1],[2],[3]]
显示(显示b)像
1\n2\n3\n
。这真的很混乱。是的。我可能会选择另一个库。我认为
fromList[[1],[2],[3]
确实是一个3x1矩阵。因为
[[1],[2],[3]]
有三个最里面的列表,它有三行。这似乎与我阅读的文档非常吻合。那么“列数”如何等于“外部列表的长度”?可能文档不正确或相互矛盾。最低限度,文档质量很差。@DietrichEpp…你是对的,那篇摘录很乱。不知怎的,在我写评论之前,我甚至没有读第二句话。将行数设为任何行的最小长度显然是错误的。第一个错误看起来很糟糕荣:源代码是
。|numCols a/=numRows b=error“矩阵。时间:`numRows a'和`numCols b'不匹配。”
这让人大吃一惊…@chi这是最新版本的源代码,是的——但我打赌OP没有使用最新版本!@DanielWagner如果这是最新版本,它看起来仍然是错误的!我还检查了github,错误仍然存在……我遗漏了什么吗?@chi错误文本是反向的(实际上是模棱两可的,因为谁知道哪个参数是
a
,哪个参数是
b
,而不读取
次的源代码?)——但实际检查是正确的。在旧版本中,错误文本与(错误)匹配检查——所以它在语义上是错误的,但至少它与代码的实际操作是准确的!我直到现在才听说过这个库。我建议使用hmatrix的静态部分。它在编译时而不是运行时捕获行/列不匹配。您可以在这里看到一个Kalman过滤器实现的示例:。过多最后一次我尝试在Windows上构建HMLL,它花费了2天的时间,使我一无所获。所以我最好使用Python或Matlab…@ USE834 108,你也可以考虑使用<代码> Cabar解压BED和BASEFLASH 1.21./CODE >以获得T的副本。如果你真的想“吃早餐还是什么都不吃”,他会寻找、修改支票,然后
阴谋集团安装
结果。
a `times` b
    | numRows a /= numCols b = error "Matrix.times: `numRows a' and `numCols b' don't match."
    | otherwise = fromList [ [ row i a `dotProd` col j b
                             | j <- [1..numCols b] ]
                           | i <- [1..numRows a] ]