F# 在多维数组中写入值

A19*_*919 3 arrays f#

我正在尝试计算协方差矩阵

运算符“expr.[idx]”已用于基于此程序点之前的信息的不确定类型的对象。考虑添加更多类型约束

CovMatrix.[a,b]

如何解决这个问题以及为什么会发生这种情况?

let FirstSeq = {1.0..10.0}
let SecondSeq = {20.0..30.0}

let All = seq {yield (0,FirstSeq); yield (1,SecondSeq)}

let cov(first:seq<float>)(second:seq<float>) =
    Seq.map2 (*) first second
    |> Seq.average
    |> fun x -> x - Seq.average first * Seq.average second

let CreateCovMatrix(strangeList:seq<int * seq<float>>) = 
    let Size = Seq.length strangeList
    let CovMatrix = Array2D.init Size Size
    let CalculateCovMatrix = 
        for (a, i) in strangeList do
            for (b, j) in strangeList do
                    CovMatrix.[a,b]=cov(i)(j)
    CalculateCovMatrix

let result = CreateCovMatrix(All)
printf "%A" result
Run Code Online (Sandbox Code Playgroud)

Gus*_*Gus 5

该函数Array2D.init有 3 个参数,缺少最后一个参数,即初始化函数。

您可以通过编写以下内容来快速修复它:

let CovMatrix = Array2D.init Size Size (fun _ _ -> 0.)
Run Code Online (Sandbox Code Playgroud)

然后你会发现下一个问题:可变引用的赋值是运算符<-,而不是=用于比较和 let 绑定的运算符。

所以你的函数将如下所示:

let CreateCovMatrix(strangeList:seq<int * seq<float>>) = 
    let Size = Seq.length strangeList
    let CovMatrix = Array2D.init Size Size (fun _ _ -> 0.)
    let CalculateCovMatrix = 
        for (a, i) in strangeList do
            for (b, j) in strangeList do
                    CovMatrix.[a,b] <- cov(i)(j)
    CalculateCovMatrix
Run Code Online (Sandbox Code Playgroud)

但您可以使用以下函数,而不是指定忽略输入并始终返回零的函数Array2D.zeroCreate

let CovMatrix = Array2D.zeroCreate Size Size
Run Code Online (Sandbox Code Playgroud)