0

我一直在开发一个带有接受两个列表的函数的 MathLink 应用程序,例如

:Pattern: g[zi_List, fi_List]

我打算手动拉入该功能。两个列表都可以是实数或复数,如果任一参数为复数,则结果为复数。此外,fi可以是方阵列表,但zi要保持一维列表。

MathLink C API中,使用起来最直接的函数是MLGetReal64Array可以处理实数和复数数据类型,如数组Complex的最内层所示。Head并且,一旦确定了复杂性,可以将数组强制转换std::complex<double>为 C99 复杂类型(如果合适)。现在,MLGetReal64Array不处理 non-rectangular Lists,因此每个List元素必须具有其他元素的维度并且属于同一类型:实数或复数。不过奇怪的是,对于一个接受单个List参数的函数,它会MLGetReal64Array返回一个数据结构,该数据结构具有一个元素List作为其最外层元素,即在事物的 c 端输入h[ {1, 3, 5} ]返回值。List[List[1,3,5]]

事实证明,对于两个列表函数,例如g,一次调用MLGetReal64Array将同时返回两个参数,即g接收List[ zi, fi ]。由于我计划对每个列表进行预处理以实现结构和元素类型的一致性,因此确保两者具有相同的元素类型不会成为问题。但是,我想fi成为一个矩阵列表,并MLGetReal64Array导致MLEGSQ: MLGet() called out of sequence错误。

所以,我的问题是:我可以MLGetReal64Array用来获取两个列表吗?我该怎么办?而且,如果我不能使用MLGetReal64Array,我的替代方案是什么?

我在想,如果MLGetReal64Array结构正确,我可以List通过使用将外部从链接中弹出MLGetFunction,然后允许我使用MLGetReal64Array每个参数。到目前为止,我还没有尝试过。但是,与此同时,我将不胜感激任何建议。

4

1 回答 1

1

我会为您拥有的不同情况创建单独的函数。在 Mathematica 方面处理这个逻辑比弄清楚你在 C 中的链接上得到了什么要容易得多。

于 2011-07-13T04:01:59.363 回答