2011-11-03 2 views
0

각 행의 사용자 (행), 어떤 행 (열)을 고려해야 할 첫 번째 행렬이 있습니다. 3 명의 사용자와 5 명의 제품을 가져 봅니다.F에서 다른 행렬로 행렬 구현하기 #

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

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을 추천했습니다 : 없음 사용자는 아이 라이크는 NUL 매트릭스를 동일 내 매트릭스 있도록 제품을 좋아 한 적이

그래서 나는이 같은 새로운 업데이트 matrixILike을 얻기 위해 matrixAction에 매트릭스 아이 라이크 덕분에 구현하고 싶습니다 :

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.map 그러나 추가적인 파라미터와 동일 List.mapi 사용.

+0

구스타보 감사합니다, 매우 인상적입니다. 다니엘 감사합니다 또한 매우 도움이 – 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의 행렬에서) 행렬의 행/열의 인덱스에 해당하지 않습니다 (예 : userID 10, 3, 1100). 아이디어가 있습니까? 그래서 "일치"를 사용하려고했는데 ... 작동하지 않습니다. – fabco63

+0

이 경우 사전의 사전이 가장 좋은 방법이라고 생각합니다. 개념적으로,'Dictionary >'와 같은 것입니다. 'DataTable'도 작동합니다. – Daniel

관련 문제