Math 在Haskell中实现Gauss-Jordan消元

Math 在Haskell中实现Gauss-Jordan消元,math,haskell,linear-algebra,Math,Haskell,Linear Algebra,我们想编程高斯消去法来计算一个基(线性代数),作为我们自己的练习。这不是家庭作业 我首先想到了[[Int]]作为矩阵的结构。我当时认为我们可以按字典顺序对列表进行排序。但是我们必须用矩阵来计算。这就是问题所在。有人能给我们一些提示吗 考虑使用软件包中的矩阵。在它的模块中,您可以找到快速和大量的。浏览他们的资料可能会帮助你消除疑虑 下面是一个简单的示例,通过将矩阵拆分为行将一行添加到另一行 import Numeric.Container import Data.Packed.Matrix ad

我们想编程高斯消去法来计算一个基(线性代数),作为我们自己的练习。这不是家庭作业


我首先想到了
[[Int]]
作为矩阵的结构。我当时认为我们可以按字典顺序对列表进行排序。但是我们必须用矩阵来计算。这就是问题所在。有人能给我们一些提示吗

考虑使用软件包中的矩阵。在它的模块中,您可以找到快速和大量的。浏览他们的资料可能会帮助你消除疑虑

下面是一个简单的示例,通过将矩阵拆分为行将一行添加到另一行

import Numeric.Container
import Data.Packed.Matrix

addRow :: Container Vector t => Int -> Int -> Matrix t -> Matrix t
addRow from to m = let rows = toRows m in
  fromRows $ take to rows ++
             [(rows !! from) `add` (rows !! to)] ++
             drop (to + 1) rows
另一个例子,这次是使用矩阵乘法

addRow :: (Product e, Container Vector e) =>
          Int -> Int -> Matrix e -> Matrix e
addRow from to m = m `add` (e <> m)
  where
    nrows = rows m
    e = buildMatrix nrows nrows
        (\(r,c) -> if (r,c) /= (to,from) then 0 else 1)
addRow::(产品e,容器向量e)=>
整数->整数->矩阵e->矩阵e
addRow from to m=m`add`(em)
哪里
nrows=行m
e=构建矩阵nrows nrows
(\(r,c)->如果(r,c)/=(to,from),则为0,否则为1)

如果您使用
[[Rational]]
而不是
[[Int]]]
,因为您得到了很好的除法,那么使用
[[Rational]]
会更容易

您可能希望从实现基本行操作开始

swap :: Int -> Int -> [[Rational]] -> [[Rational]
swap r1 r2 m = --a matrix with r1 and r2 swapped

scale :: Int -> Rational -> [[Rational]] -> [[Rational]]
scale r c m = --a matrix with row r multiplied by c

addrow :: Int -> Int -> Rational -> [[Rational]] -> [[Rational]]
addrow r1 r2 c m = --a matrix with (c * r1) added to r2
为了实际执行guassian消去法,您需要一种方法来决定将一行的倍数添加到另一行以获得零。所以给两排

5 4 3 2 1
7 6 5 4 3
我们想把c乘以第1行和第2行,这样7就变成了零。所以
7+c*5=0
c=-7/5
。所以为了求解c,我们只需要每行的第一个元素。下面是一个查找c的函数:

whatc :: Rational -> Rational -> Rational
whatc _ 0 = 0
whatc a b = - a / b

另外,正如其他人所说,使用列表来表示矩阵会使性能下降。但是如果你只是想理解算法,列表应该是可以的。

这有点模糊:“但是我们必须用矩阵计算。这就是问题所在。”你对什么计算有问题?我必须在b行中添加一行a:add(x:xs)(y:ys)=(x+y):add xs ys。但是我如何才能使2行的第一个元素为0。
[[Int]]
对于矩阵来说通常是个坏主意,因为我怀疑您是否需要O(n)复杂度访问。考虑<代码>数据。数组< /代码>(低级),甚至<代码> HMatLase/COD>(如JAN建议的)。实际上,只需要欧几里得除法来执行高斯消去(它更复杂)。可以添加类型吗?我相信他们会大大有助于理解这些例子