如何编排多维数组

66

我们有一些涉及矩阵的Interop代码。我试图调用本地DLL,在大部分情况下它非常可靠。

我依赖于 .net默认封送, 避免使用非托管指针,而是在大部分情况下使用.net数组,可能偶尔使用byref。.net文章说,多维数组隐式封送为按列主序的一维数组,这很好。

唯一不起作用的是,尝试封送多维数组,因为F#编译器抱怨float[,]extern声明中不被允许。是否有任何方法可以解决这个限制?

我知道F# PowerPack中的PinnedArrayPinnedArray2类型,但我正在寻找一种依赖于托管指针的解决方案 - 更重要的是,我想避免仅为了PinnedArray类而将F# PowerPack包含为依赖项。


1
我怀疑这篇文章所指的是 C 语言中的多维数组。我对 C 语言不是很熟悉,但是多维 C 数组使用的语法是否类似于 .NET 中的交错数组呢?我认为 C 语言没有像 float[,] 这样的东西。那么你尝试过使用 float[][] 吗? - Daniel
根据该文章,锯齿数组无法隐式地进行编组,而多维数组应该可以进行编组。 - Daniel Fabian
3
你是否考虑到了关注点分离?你可以将业务逻辑组织在 F# 中,让 C# 组件负责交互、通信和其他基础设施相关的事情。这样,问题就迎刃而解了... - mikalai
3
虽然以多语言方式进行操作是一个有趣的想法,但这并不能回答如何在F#中实现的问题。除此之外,在以多语言方式仅执行p/invoke部分时(我们几乎完全使用F#),C#是错误的语言。最终,我用C++/CLI完成,并使用真正的C头文件进行P/Invoke,并为其提供了一个.NET友好的接口。这样做的额外好处是可以为P/Invoke签名提供编译器。 - Daniel Fabian
多维数组性能很差,你可能也不想使用它们。只需编写自己的编组代码来构建锯齿状数组即可。 - Asik
显示剩余2条评论
1个回答

1
通过以下链接中关于可平板和不可平板类型的描述,您可以尝试使用System.Double代替float,因为它们在托管代码和非托管代码之间传递时不需要转换,这意味着Interop Marshaler不再需要特殊处理,从而提高性能: https://msdn.microsoft.com/en-us/library/75dwhxf7%28v=vs.110%29.aspx 我进行了搜索,找到了这个相关主题,可能会对您有所帮助:
Threat like a single array: http://stackoverflow.com/a/18607817/4597705

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接