.net 点积函数

.net 点积函数,.net,matrix,f#,.net,Matrix,F#,我编写了一个点积函数,它包含两个列表: let inline dot a b = List.zip a b |> List.map (fun (a, b) -> a * b) |> List.reduce (+) 有没有更好的方法来计算点积而不使用List.zip一个较短的方法是使用List.map2: let inline dot a b = List.map2 (*) a b |> List.sum 另一种方法是使用列表。fold2: le

我编写了一个点积函数,它包含两个列表:

let inline dot a b =
    List.zip a b
    |> List.map (fun (a, b) -> a * b)
    |> List.reduce (+)

有没有更好的方法来计算点积而不使用
List.zip

一个较短的方法是使用
List.map2

let inline dot a b = List.map2 (*) a b |> List.sum
另一种方法是使用
列表。fold2

let inline dot a b = List.fold2 (fun state x y -> state + x * y) LanguagePrimitives.GenericZero a b

我同样需要用F#和矩阵来做神经网络,但是你可以使用向量

我使用了它的许多其他功能

确保您同时获得和

如果你在做神经网络,并且会使用MathNet数学和矩阵,那么你可能会想要


这是一个与使用F#中的MathNet Numerics矩阵的神经网络相关的反向传播。在这三个建议中,我相信使用
列表的一个。fold2
是最快的:

let inline dot1 a b =
    List.zip a b
    |> List.map (fun (a, b) -> a * b)
    |> List.reduce (+)

let inline dot2 a b = List.map2 (*) a b |> List.sum

// Modified with 0.0 instead of 0 and no 'inline'
let dot3 a b = List.fold2 (fun state x y -> state + x * y) 0.0 a b

let xs = [0.0..1000000.0]

> dot1 xs xs;;
Real: 00:00:00.242,

> dot2 xs xs;;
Real: 00:00:00.070

> dot3 xs xs;;
Real: 00:00:00.003

压缩这两个列表可能相当昂贵。
map2sum
解决方案速度更快,但会在列表中迭代两次。
fold2
解决方案只遍历列表一次。

第二个函数中的
inline
没有帮助,因为
0
强制它具有返回类型
int
。如果
inline
要使函数可泛化,使用
LanguagePrimitives.GenericZero
而不是
0
可以工作。如果只是告诉编译器“不要在这里生成函数调用”,那就没问题了。为什么要使用
0.0
而不是
LanguagePrimitives.GenericZero
使
dot3
成为泛型函数?我相信不强制使用泛型可以让函数计算得更快,对吗?@MiP-我不确定。我再次尝试使用
LanguagePrimitives.GenericZero
而不是
0.0
,速度没有明显变化。