在从c#调用的Matlab函数中保存状态

时间:2015-07-13 14:14:08

标签: c# matlab matlab-compiler

我试图从C#调用Matlab函数,这不是一个真正的问题,问题是我需要在Matlab部分保持状态,以便在下一次计算中使用以前的结果。此状态应仅存在于Matlab运行时中。

enter image description here

我试过在C#中没有运气的情况下使用全局变量,我想这根本不是一个漂亮的解决方案,不是吗?

我也尝试了getmcruserdata / setmcruserdata,但我只能在Matlab中使用C#而不是C#。

我希望有人有一些意见或更好的例子。

更新

我尝试了以下方法

classdef 但是MabLab类似乎不适用于.Net

全局变量(无效)

function y = stateCalc1(x)

global state
state = state + x;

y = state;

持久性(没有用)

function y = statePersistent(x)

persistent state
state = state + x;

y = state;

getmcruserdata / setmcruserdata (工作)

function y = stateCalc2(x)

val = getmcruserdata('data');

if (isempty(val))
    val = x;
else
    val = val + x;    
end

setmcruserdata('data',val);

y = val;

现在实际上有效,但我仍然不知道这是否是最佳方法?

净/ C#

  var testClass = new TestClass();

  for (int i = 0; i < 10; i++)
  {
    MWArray input = i;
    result = testClass.stateCalc(input);

    var output = (MWArray)result;
    Console.WriteLine(output);
  }

  Console.ReadKey();

1 个答案:

答案 0 :(得分:1)

我假设你在这里使用MATLAB Compiler SDK来创建MATLAB组件(或者在旧版MATLAB中已知的MATLAB Builder for .NET)。

如果是这样,它实际上是为部署不需要状态的功能而设计的 - 您通常会使用纯粹的基于功能的界面来部署。如果你必须存储状态,那么如果能在.NET端执行此操作会更好。

您可以使用persistent变量在函数调用之间存储状态,但是您需要小心,因为该变量只会在MCR保持运行时保持持久性。如果你的.NET调用使MCR启动,执行函数调用,然后关闭MCR,变量将不会在调用之间保持持久性。

如果你需要确保MCR保持运行,你可以编写一个小的.NET包装器应用程序,除了启动MCR之外什么也不做,然后通过主应用程序的任何调用(并在退出时关闭它)。您可能还需要担心显式监视MCR以防止它崩溃(例如导致它耗尽内存),如果它这样做,则将其重新启动。

在开始这条路线之前,请先看看MATLAB Production Server。这是一个附加产品,旨在解决您最终面临的一些问题,例如管理MCR池 - 它也做了很多,但它相对昂贵,所以它可能是对你的申请来说太过分了。

或者,您可以随时通过在函数调用之间写入和读取文件来存储状态 - 但这可能会很慢,具体取决于您所在州的大小。