Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization F#和ILN数值_Optimization_F#_Numerical Analysis_Ilnumerics - Fatal编程技术网

Optimization F#和ILN数值

Optimization F#和ILN数值,optimization,f#,numerical-analysis,ilnumerics,Optimization,F#,Numerical Analysis,Ilnumerics,我刚刚下载了ILNumerics的最新版本,将用于我的F#项目。可以利用F#中的这个库吗?我尝试过简单的计算,但似乎很麻烦(用F#) 我想建立一个有约束(甚至无约束)的优化问题。通常的Rosenbrock函数可以,然后我将使用我自己的函数。我甚至在定义数组时都遇到了困难。我能定义的唯一一种数组是一个RetArray,例如使用下面的代码 let vector = ILMath.vector<float>(1.0, 2.0) 我明白了 错误:对象引用未设置为对象的实例 在F#中使用IL

我刚刚下载了ILNumerics的最新版本,将用于我的F#项目。可以利用F#中的这个库吗?我尝试过简单的计算,但似乎很麻烦(用F#)

我想建立一个有约束(甚至无约束)的优化问题。通常的Rosenbrock函数可以,然后我将使用我自己的函数。我甚至在定义数组时都遇到了困难。我能定义的唯一一种数组是一个RetArray,例如使用下面的代码

let vector = ILMath.vector<float>(1.0, 2.0)
我明白了

错误:对象引用未设置为对象的实例

在F#中使用ILNumerics的建议方法是什么?是否可以在F#中使用本机库,或者我被迫从C#库调用我的F#代码来使用整个ILNumerics库?除了上面提到的问题之外,我在理解ILNumerics的基本逻辑时遇到了一些问题,当移植到F#中时

例如,在示例代码中,F#等效于C#使用范围是什么,如:

using (ILScope.Enter(inData)) { ...

}

c
的第二次访问失败的原因是ILNumerics正在执行一些非常不寻常的内存管理,这在您可能没有预料到的情况下会自动执行。在C#中,这是通过从
向量
数组
的隐式转换来管理的:

// C#
var A = vector<int>(1, 2, 3);          // bad!
Array<int> A = vector<int>(1, 2, 3);   // good
注意,我已经创建了一个名为
的内联助手函数使这更容易。每次在F#中创建ILNumerics向量时,必须调用此函数将其转换为数组。(我知道这很难看,但我看不到更容易的选择。)

为了回答您的最后一个问题,等效的F#代码是:


为了详细说明一下brianberns的答案,你可以做一些事情来让自己更轻松

我个人不会去定义一个自定义操作符,尤其是一个。相反,也许你应该考虑使用A来处理ILMyType。这将允许您隐藏很多丑陋之处,当使用非F#标准(例如隐式类型转换)处理库时会出现这些丑陋之处

我没有访问ILMath的权限,所以我只是实现了这些虚拟替代方案,以便让我的代码进行编译。我怀疑您应该能够不在中复制它,其余的代码将按预期工作

module ILMath =
    type RetArray<'t> = { Values: 't seq }

    and Array<'t> = { OtherValues: 't seq } with
        static member op_Implicit(x: RetArray<_>) = { OtherValues = x.Values }
        static member inline (+) (x1, x2) = { Values = (x1.OtherValues, x2.OtherValues) ||> Seq.map2 (+) }

type ILMath =
    static member vector<'t>([<ParamArray>] vs : 't []) = { ILMath.Values = vs }
这应该在顶层定义和实例化(
ilmath
变量)。这让你可以写作

let c = ilmath {
    let! a = vector(1.0, 2.0)
    let! b = vector(3.2, 2.2)
    return a + b
}

当然,这个实现只增加了对很少事情的支持,并且要求,例如,类型为
RetArray的值“但是如果我试图检索c的值”,您能详细说明一下吗?你的问题没有任何可以访问c的代码。@JimFoye我相应地修改了帖子。感谢您的澄清。关于
使用
这里是关于的语言参考。因此,代码将看起来像
使用(ILScope.Enter inData)(fun()->一些计算)
FWIW,我也考虑过计算生成器,但对于那些只想使用库的人来说,这是相当多的工作。(构建器应该由ILNumerics自己提供。)另外,请注意,您的上一个代码片段与我编写的非常相似-主要区别在于
的位置.Torbonde,非常感谢。这是一个很好的答案@布莱恩伯恩斯:你绝对是对的。我喜欢这个答案,它很有启发性,但我可能会先尝试一种更简单的方法,只是为了使用这个库。非常感谢你们两位,非常感谢。我将尝试使用你的方法,并可能向你汇报。这确实更有意义。
// C#
var A = vector<int>(1, 2, 3);          // bad!
Array<int> A = vector<int>(1, 2, 3);   // good
open ILNumerics
open type ILMath   // open static class - new feature in F# 5

let inline (!) (x : RetArray<'t>) =
    Array<'t>.op_Implicit(x)

[<EntryPoint>]
let main argv =
    let a = !vector<float>(1.0, 2.0)
    let b = !vector<float>(3.2,2.2)
    let c = !(a  + b)
    printfn "%A" c
    printfn "%A" c
    0
use _scope = Scope.Enter(inData)
...
module ILMath =
    type RetArray<'t> = { Values: 't seq }

    and Array<'t> = { OtherValues: 't seq } with
        static member op_Implicit(x: RetArray<_>) = { OtherValues = x.Values }
        static member inline (+) (x1, x2) = { Values = (x1.OtherValues, x2.OtherValues) ||> Seq.map2 (+) }

type ILMath =
    static member vector<'t>([<ParamArray>] vs : 't []) = { ILMath.Values = vs }
type ILMathBuilder() =
    member __.Bind(x: ILMath.RetArray<'t>, f) =
        f(ILMath.Array<'t>.op_Implicit(x))
    member __.Return(x: ILMath.RetArray<'t>) =
        ILMath.Array<'t>.op_Implicit(x)

let ilmath = ILMathBuilder()
let c = ilmath {
    let! a = vector(1.0, 2.0)
    let! b = vector(3.2, 2.2)
    return a + b
}