我有第一个矩阵,它应该考虑每个用户(在行中)他们喜欢哪些产品(在列中)。 我们需要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
如果您有任何建议我会接受。
答案 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。