矩阵在Haskell平均

时间:2016-06-08 21:13:54

标签: haskell matrix

我有一个矩阵,让我们使用这个例子:

[ [4.0, 2.0, 0.6],
  [4.2, 2.1, 0.59], 
  [3.9, 2.0, 0.58], 
  [4.3, 2.1, 0.62], 
  [4.1, 2.2, 0.63] ] 

现在,我取每列的平均值,结果如下:

 [4.10, 2.08, 0.604]

我能做的所有这些,我都有信息。

我现在遇到问题的是这个部分。我正在寻找一种方法,用第一个矩阵中各自的元素减去每个平均元素。

它应该是这样的:

[ [-0.1, -0.08, -0.004],
  [0.1, 0.02, -0.014],
  [-0.2, -0.08, -0.024],
  [0.2, 0.02, 0.016],
  [0.0, 0.12, 0.026]  ]

我必须使其适用于任意大小的矩阵。

2 个答案:

答案 0 :(得分:2)

类似的东西,没有验证和格式化

colmean rs = let (a,c) = agg rs in map (/(fromIntegral c)) a

agg [r] = (r,1)
agg (r:rs) = let (a,c) = agg rs in (zipWith (+) a r, c+1)

minus = flip (zipWith (-))

demean x = map (minus $ colmean x) x

> demean media
[[-9.999999999999964e-2,-8.000000000000007e-2,-4.0000000000000036e-3],
 [0.10000000000000053,2.0000000000000018e-2,-1.4000000000000012e-2],
 [-0.19999999999999973,-8.000000000000007e-2,-2.400000000000002e-2],
 [0.20000000000000018,2.0000000000000018e-2,1.6000000000000014e-2],
 [0.0,0.1200000000000001,2.6000000000000023e-2]]

这样,第二个维度(列数)可以是无限的

> map (take 10) $ demean [[1..], [2..]]
[[-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5],
 [0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5]]

答案 1 :(得分:1)

这是我将如何做到的:

mean l = sum l / (fromIntegral (length l))

getColumnMeans = map mean . transpose

normalizeMatrix m = map (zipWith subtract columnMeans) m
    where
        columnMeans = getColumnMeans m

mean正如其名称所暗示的那样,getColumnMeans是您似乎自己实现的功能。

normalizeMatrix是您正在寻找的功能。它接受一个矩阵,计算其列方式,然后通过map从每一行中减去它。

subtract函数基本上是(-),但其参数被翻转。每当我想要映射像subtract 5这样的东西时,我都会使用它,它就像普通英语一样。因此,subtract 5 10会返回5。在这里,zipWith subtract columnMeans在逐行输入的基础上进行。 map为所有行执行此操作。希望这很有用。