编译后的 Matlab 函数只工作一次
Posted
技术标签:
【中文标题】编译后的 Matlab 函数只工作一次【英文标题】:Compiled Matlab function works only once 【发布时间】:2011-04-29 13:54:03 【问题描述】:我有一个 Matlab 函数编译成 C 库。我正在使用 C# 应用程序中的这个库。
如果我第一次在 C 库中调用我的函数,一切正常,但第二次调用会导致异常 - mlfMyfunc 返回指向结果的空指针 insted 指针(即使在 mlfMyfunc 调用之后,output1 和 output2 参数也是 IntPtr.Zero)
我的 DoubleArray
类(围绕 mx...
函数的包装)已经过良好测试,我认为它可以正常工作。
你知道问题出在哪里吗?
谢谢。卢卡斯
C#代码:
using Native;
class MatlabAlgosBridge
[DllImport("Algos.dll"]
private static extern bool AlgosInitialize();
[DllImport("Algos.dll")]
private static extern void AlgosTerminate();
[DllImport("Algos.dll")]
private static extern bool mlfMyfunc([In] int nargout, ref IntPtr output1, ref IntPtr output2, [In] IntPtr xVar, [In] IntPtr time, [In] IntPtr algoParam, [In] IntPtr Ts, [In] IntPtr codes);
public List<double> Analyze(List<double> xValues)
double[] result = null;
try
Native.Mcl.mclInitializeApplication("NULL", 0)
AlgosInitialize();
DoubleArray xValM = DoubleArray.CreateMatrix(xValues.Data.Count, 1);
// Other parameter initialization
IntPtr output1 = IntPtr.Zero;
IntPtr output2 = IntPtr.Zero;
mlfMyfunc(2, ref output1, ref output2, xValM.Pointer, time.Pointer, params.Pointer, ts.Pointer, codes.Pointer);
result = new MArray(output1).AsDoubleVector();
finally
AlgosTerminate();
Native.Mcl.mclTerminateApplication();
return result;
解决方案:
问题是由重复的 Matlab 引擎初始化引起的。每次我调用分析函数时,引擎都会被初始化(Native.Mcl.mclInitializeApplication
],即使它在finally
块中被正确终止(Native.Mcl.mclTerminateApplication
),重复初始化也会出现问题。内置的 matlab 函数仍然可以正常工作,但是我的库不要。
解决方案是将 mclInitializeApplication
调用移到分析函数之外,并确保在应用程序生命周期内只调用一次。
【问题讨论】:
【参考方案1】:问题是由重复的 Matlab 引擎初始化引起的。每次我调用Analyze
函数时,引擎都会被初始化(Native.Mcl.mclInitializeApplication
),即使它在 finally 块中被正确终止(Native.Mcl.mclTerminateApplication
),重复初始化也会出现问题。内置 matlab 函数仍然可以正常工作,但我的库不能。
解决方案是将 mclInitializeApplication
调用移到 Analyze
函数之外,并确保在应用程序生命周期内只调用一次。
【讨论】:
【参考方案2】:尝试使用 globalAlloc 分配 IntPtrs
【讨论】:
感谢您的建议,但没有奏效。问题在于 Matlab 引擎初始化 - 请参阅我编辑的问题以上是关于编译后的 Matlab 函数只工作一次的主要内容,如果未能解决你的问题,请参考以下文章