用F#中的另一个矩阵实现矩阵

时间:2011-11-03 12:16:46

标签: f# matrix

我有第一个矩阵,它应该考虑每个用户(在行中)他们喜欢哪些产品(在列中)。 我们需要3个用户和5个产品。 没有用户喜欢产品,所以我的矩阵ILike等于nul矩阵:

let matrixILike = [[0.; 1.;2.;3.]
                   [1.;0.;0.;0.]
                   [2.;0.;0.;0.]
                   [3.;0.;0.;0.]
                   [4.;0.;0.;0.]
                   [5.;0.;0.;0.]]

现在用户1喜欢产品2而用户3喜欢产品5,可以在以下矩阵中进行总结:

let matrixAction = [[1.;2.]
                    [3.;5.]]

所以我想通过matrixAction实现矩阵ILike,以获得一个新的更新的matrixILike,如下所示:

let matrixILike = [[0.; 1.;2.;3.]
                   [1.;0.;0.;0.]
                   [2.;1.;0.;0.]
                   [3.;0.;0.;0.]
                   [4.;0.;0.;0.]
                   [5.;0.;0.;1.]] 

我尝试使用“匹配”代码执行此操作,但它无效。

for k = 0 to matrixAction.NumRows - 1 do
            match  (matrixAction.[k,0] , matrixAction.[k,1]) with
            | (matrixILike.[x,0] , matrixILike.[0,y]) -> (matrixILike.[x,y] <- 1.)
            | _ -> (matrixILike.[x,y] <- 0.)
matrixILike

如果您有任何建议我会接受。

2 个答案:

答案 0 :(得分:4)

如果您将matrixILike更改为数组,这是微不足道的。

let matrixILike = [|
  [|0.;1.;2.;3.|]
  [|1.;0.;0.;0.|]
  [|2.;0.;0.;0.|]
  [|3.;0.;0.;0.|]
  [|4.;0.;0.;0.|]
  [|5.;0.;0.;0.|]
|]

let matrixAction = [
  (1., 2.)
  (3., 5.)
]

matrixAction
|> List.iter (fun (u, p) -> matrixILike.[int p].[int u] <- 1.)

答案 1 :(得分:1)

在不更改输入参数的情况下,此功能可以完成工作。

let update actions = 
    let mapiTail f = function 
                     | []   -> [] 
                     | h::t -> h :: List.mapi (f h) t
    mapiTail (fun matHead _ ->
        mapiTail (fun rowHead i x -> 
            if List.exists ((=) [matHead.[i+1];rowHead]) actions then 1. else x))

用法:

update matrixAction matrixILike

它使用List.mapi,它与List.map相同,但附加参数:index。