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

F# 用F中的另一个矩阵实现一个矩阵#,f#,matrix,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.]

我有第一个矩阵,它应该说明每个用户(行)喜欢哪些产品(列)。 让我们以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,以获得新的更新矩阵,如下所示:

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
k=0到matrixAction.NumRows-1 do的

将(矩阵运算[k,0],矩阵运算[k,1])与

|(matrixILike.[x,0],matrixILike.[0,y])->(matrixILike.[x,y](matrixILike.[x,y]如果将
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.)
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.)
]
矩阵作用

|>List.iter(fun(u,p)->matrixILike.[int p].[int u]如果将
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.)
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.)
]
矩阵作用

|>List.iter(fun(u,p)->matrixILike.[int p].[int u]在不更改输入参数的情况下,此函数将完成此任务

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.map相同的List.mapi,但带有附加参数:索引。

在不更改输入参数的情况下,此函数将完成此任务

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.map相同的List.mapi,但附加了一个参数:索引。

不一定是功能性的,但很漂亮:)谢谢Daniel,确实不错(也很漂亮),但我的示例太简单了……如果用户ID(在matrixILike中的上一个示例1、2和3中)与matrixILike(例如userID 10、3、1100)的行/列索引不对应,您有什么想法吗?这就是为什么我尝试使用“匹配”…但它不起作用我想,在这种情况下,字典字典是你最好的选择。从概念上来说,类似于
字典
。数据表
也会起作用。
不一定是功能性的,但很漂亮:)谢谢你,丹尼尔,的确不错(也很漂亮),但我的例子太简单了…如果用户ID(在我之前的matrixILike示例1、2和3中)与matrixILike的行/列的索引(例如userID 10、3、1100)不对应,您有什么想法吗?这就是我尝试使用“匹配”的原因…但它不起作用我想,在这种情况下,字典字典是你最好的选择。从概念上来说,像
字典
。数据表
也会起作用。谢谢你古斯塔沃,非常令人印象深刻。也谢谢丹尼尔非常有帮助谢谢古斯塔沃,非常令人印象深刻。也谢谢丹尼尔非常有帮助