编译的Matlab函数只工作一次

本文关键字:一次 工作 Matlab 函数 编译 | 更新日期: 2023-09-27 17:53:38

我有一个Matlab函数编译成C库。我正在使用c#应用程序中的这个库。

如果我第一次在C库中调用我的函数,一切都很好,但第二次调用会导致异常- mlfMyfunc返回空指针,而不是指向结果的指针(output1和output2参数是IntPtr)。即使mlfMyfunc调用后也是0)

我的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),甚至它被正确终止(Native.Mcl.mclTerminateApplication)在finally块,重复初始化出了问题。内置的matlab函数仍然可以正常工作,但我的库没有。

解决方案是将mclInitializeApplication调用移到Analyze函数之外,并确保它在应用程序生命周期中只被调用一次。

编译的Matlab函数只工作一次

问题是由重复的Matlab引擎初始化引起的。每次我调用Analyze函数,引擎被初始化(Native.Mcl.mclInitializeApplication),甚至在最后块中被正确终止(Native.Mcl.mclTerminateApplication),重复初始化出现问题。内置的matlab函数仍然可以正常工作,但我的库没有。

解决方案是将mclInitializeApplication调用移到Analyze函数之外,并确保它在应用程序生命周期中仅被调用一次。

尝试使用globalAlloc分配IntPtrs