Реализовать матрицу с другой матрицей в F # - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть первая матрица, которая должна учитывать для каждого пользователя (в строках), какие продукты (в столбцах) им нравятся. Давайте возьмем 3 пользователей и 5 продуктов. Ни одному пользователю продукт не понравился, поэтому моя матрица ILike равна нулю:

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, чтобы получить новую обновленную матрицу, например:

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

Я пытаюсь сделать это с кодом "match with", но он не работает.

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 ]

4 голосов
/ 03 ноября 2011

Это тривиально, если вы измените 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 голос
/ 08 ноября 2011

Без изменения ваших входных параметров, эта функция сделает работу.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...