2011-11-03 109 views
0

我有第一个矩阵,它应该为每个用户(在行中)他们喜欢哪些产品(列)进行计算。 我们带3个用户和5个产品。 没有用户喜欢的产品,所以我的矩阵iLike的等于NUL矩阵:用F#中的另一个矩阵实现矩阵

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.]] 

所以我想实现矩阵iLike的感谢matrixAction获得新的更新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.]] 

我尝试用“匹配无线做到这一点th“代码,但它不起作用。

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 

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

回答

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但是具有附加的参数:索引。

+0

谢谢Gustavo,非常可观。也感谢丹尼尔非常有帮助 – fabco63

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.) 
+0

不一定功能,但很漂亮:) – Benjol

+0

谢谢丹尼尔,确实没问题(而且很漂亮),但我的例子太琐碎了......如果用户ID(在我之前的例子1,2和3中的matrixILike )不对应于matrixILike的行/列的索引(例如用户ID 10,3,1100),你有想法吗?这就是为什么我试图使用“匹配”...但它不起作用 – fabco63

+0

我认为,在这种情况下,字典词典将是你最好的选择。从概念上讲,像'Dictionary >'。一个'DataTable'也可以工作。 – Daniel