1

2 つの行列を乗算しようとしています。

この投稿から取得した転置を使用しています: F# マトリックスの転置関数について説明してください

let rec transpose = function
| (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
| _ -> []

また、2 つのリストのすべての要素を乗算してから追加する innerMult も使用しています。

let rec innerMult u v =
match u, v with 
| [x], [y] -> x*y     | u'::u, v'::v -> u'*v' + inner u v 

したがって、これら 2 つの関数を使用して、行と列を乗算しようとします。もちろん、両方の行列が乗算が発生する条件を満たしていると仮定します。つまり、行は列と等しくなければなりません。

行列乗算コード:

let multiply (xs, ys) = 
let tl = transpose ys in 
    let rec mMult xs = 
    match xs, tl with
    | x::xs, t::tl -> inner x t
  mMult xs;;

テスト: 乗算 ([[1;2;3];[4;5;6]], [[0;1];[3;2];[1;2]]);; 出力: > val it : int = 9

現時点では、実際に行列の乗算を行うために、再帰または List.map がありません。これを解決する方法がわかりません。

4

1 に答える 1

4

これはうまくいくはずです:

let multiply xs ys =
    [for row in xs ->
         [for col in transpose ys -> inner row col]]
于 2013-06-06T17:15:24.580 に答える