Как я могу использовать функцию в F # с двумя параметрами, которые являются двумерными массивами целых - PullRequest
0 голосов
/ 09 мая 2019

Я совершенно новичок в f # и мне нужна помощь для домашней работы

У меня есть эта функция, и когда я вызываю ее с параметрами, она возвращает ошибку

вот код

let MatrixMultiply (matrix1 : _[,] , matrix2 : _[,]) =
    let result_row = (matrix1.GetLength 0)
    let result_column = (matrix2.GetLength 1)
    let ret = Array2D.create result_row result_column 0
    for x in 0 .. result_row - 1 do
        for y in 0 .. result_column - 1 do
            let mutable acc = 0
            for z in 0 .. (matrix1.GetLength 1) - 1 do
                acc <- acc + matrix1.[x,z] * matrix2.[z,y]
            ret.[x,y] <- acc
    ret

вот сообщение об ошибке:

ошибка FS0001: ожидание типа, поддерживающего оператор '*', но с типом кортежа

let mat3 = (MatrixMultiply (mat1, mat2))
printfn "%A" mat3

так я использую эту функцию, переменные mat1 и mat2 представляют собой 3x3 2D-матрицы

let mat1 = Array2D.init 3 3 (fun x y -> (rand.Next(x+10),rand.Next(y+10)))
let mat2 = Array2D.init 3 3 (fun x y -> (rand.Next(x+10),rand.Next(y+10)))

1 Ответ

2 голосов
/ 09 мая 2019

Проблема в том, как вы определили mat 1 и mat 2:

let mat1 = Array2D.init 3 3 (fun x y -> (rand.Next(x+10),rand.Next(y+10)))
let mat2 = Array2D.init 3 3 (fun x y -> (rand.Next(x+10),rand.Next(y+10)))

Проблема в том, что (rand.Next(x+10),rand.Next(y+10) - это кортеж, (val1, val2).mat1 и mat2 являются 2D массивами кортежей .Если вы просто напишите это:

let mat1 = Array2D.init 3 3 (fun x y -> rand.Next(x + y)) // or whatever max number you want
let mat2 = Array2D.init 3 3 (fun x y -> rand.Next(x + y))
let mat3 = MatrixMultiply(mat1, mat2)

, это будет работать.

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