我有一个矩阵,让我们使用这个例子:
[ [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] ]
我必须使其适用于任意大小的矩阵。
答案 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
为所有行执行此操作。希望这很有用。