编译后的 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 函数只工作一次的主要内容,如果未能解决你的问题,请参考以下文章

一次一密加密解密算法

python将列表里的字符串一次一次显示出来

科学在一次一次的葬礼中进步

matlab求二元一次方程组

Java基础教程(25)--I/O流

线程同步代码块:两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。