你是对所有点。 ILNumerics目前没有优化软件包。但是,正如您所知,.NET的一大优势是易于整合外部封装。有几个选项存在这里:
的PInvoke(本机模块)
由于大多数现有的优化包存在作为本机模块,PInvoke的是你的朋友。存在几种自动DLLImport签名生成工具。我个人更喜欢创建这些签名manually。尤其是,由于大多数科学软件包都提供了一个简单的签名,该签名很容易并入.NET。但是,从本机到托管代码的回调和复杂结构的编组问题可能会出现。 (SO,我们将帮助您解决所有这些...
.NET模块
您可能会发现现有的.NET优化模块。看到这个职位(Free Optimization Library in C#)或尝试使用Microsoft求解基础,更好的模块可已经存在 - 我还没有找过一段时间,除非执行过程非常仔细,否则它们可能会因性能不佳(无)内存管理而受到影响(据我所知,没有其他项目会跟踪内存与ILNumerics相同的有效方式)但是,连接这些库会很容易:不需要DLLImport签名,但为了从ILNumerics内存管理中获益,必须在'ILNumerics'一侧管理数组内存。因此,模式给一些System.Array的一些其他.NET功能将是:
.... inside ILNumerics function
using (ILScope.Enter(inparameter1,inparameter2)) {
....
ILArray<double> A = zeros(1000,1000); // allocate memory for external use
var aArray = A.GetArrayForWrite(); // fetch reference to underlying System.Array
callOtherLib(aArray); // let other lib use and fill the array
// proceed normally with A...
return A + 1 * 2 ... ;
}
如果其它LIB从给定的阵列读取只,A.GetArrayForRead()可以给出更好的性能。通过使用该方案,可以确保最有效的内存使用 - 至少在实现的ILNumerics方面。
从两侧混合数据结构不会造成任何伤害 - 但通常也不会带来太多好处:通常这会减少方便的语法,因为没有用于混合矩阵实现的组合运算符。此外,您经常会被迫将您的矩阵访问分解为元素操作,这可能导致性能较低的解决方案。因此,我建议使用明确分离的API的模块化设计。
上述内存方案也适用于(并建议)接口本机库。当然 - -
使用ILNumerics只有
另一种方法是重新实现一些自己的模块,使用内置的功能和特性阵列ILNumerics。这种方式是强制性的,以便任何软件包都被纳入官方的ILNumerics发行版。它带来了几个优点:可以利用方便的ILNumerics语法,自动从高效的ILNumerics内存管理中获益,并且代码将在最终完全与平台无关。此外,这为您提供了关于算法所需功能的最大灵活性。
感谢如常。我想我正走向艰难的道路:编码我自己的优化器。因此我想我还有一个问题:我可以使用并行化,即Parallel类,还是ILArrays?处理这个问题的最好方法是什么?我应该把它们当作任何数据结构吗?在此先感谢 –
ILNumerics中的所有内置函数在内部自动并行化。但是,ILArray不*线程安全。在多线程场景中处理ILArray时,您将不得不使用通用同步选项。如果您有其他疑虑,请打开一个新问题。 –