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

Posted

技术标签:

【中文标题】在从 C# 调用的 Matlab 函数中保存状态【英文标题】:Save state in Matlab function called from c# 【发布时间】:2015-07-13 14:14:08 【问题描述】:

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

我尝试在 C# 中使用全局变量,但没有任何运气,我想这根本不是一个很好的解决方案,或者是吗?

我也尝试过 getmcruserdata/setmcruserdata 但我只能在 Matlab 中而不是在 C# 中。

我希望有人能提供一些意见,或者提供一些更好的例子。

更新

我尝试了以下方法

类定义 但 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;

现在确实有效,但我仍然不知道这是否是最好的方法?

.Net/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();

【问题讨论】:

一些代码可能会有所帮助。只是需要维护状态的 matlab 函数的一个小示例以及您用来调用它的 C# 代码(请参阅here) 为什么你的州需要留在Matlab?您能否在返回函数中包含状态值并将输出(带状态)作为输入传递给您对 Matlab 函数的下一次调用? 为广告道歉,但您也许可以通过使用ILNumerics 完全消除问题并留在 C# 中,不是吗? @MattBurland 我通常会提供一个例子,但它是一个概念证明,Matlab 中的函数可能是 x = x +1。我在 C# 中使用 MATLAB Compiler SDK som 它再次只是调用一个方法。但我会举一些例子。 @thinklarge 在 Matlab 部分有状态的原因是因为有一个团队提供 C# 部分,另一个团队提供 Matlab 代码,并且 Matlab 团队能够以动态类型存储状态并且不被绑定到.Net 类型。所以唯一的合同就是数据传输。我实际上尝试将状态存储在 Matlab 类中,以便在下一次计算中将其发回,但它对我不起作用。 【参考方案1】:

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

如果是这样,它确实是为部署不需要状态的功能而设计的 - 您通常会使用纯基于函数的界面来部署事物。如果您必须存储状态,最好在 .NET 端执行此操作。

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

如果您需要确保 MCR 保持启动状态,您可以编写一个小型 .NET 包装应用程序,该应用程序只启动 MCR,然后传递来自主应用程序的所有调用(并在退出时将其关闭)。您可能还需要担心显式监控 MCR,以防万一您导致它崩溃(例如,导致它耗尽内存),如果发生这种情况,请将其恢复。

不过,在您开始这条路线之前,请先查看MATLAB Production Server。这是一个附加产品,旨在解决您最终将面临的一些问题,例如管理 MCR 池 - 不过,它还可以做更多事情,而且相对昂贵,因此对于你的申请。

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

【讨论】:

你说得对,我使用的是 MATLAB Compiler SDK。我知道我正在尝试将一个正方形放入一个圆孔中,但是如果我们可以在 .Net 中尝试 Matlab 算法而不将它们移植到 C# 中,它可以节省一些时间和精力。我认为 MATLAB 生产服务器将是矫枉过正。我会看一下persistent,只要 MCR 正在运行,它就只有状态,这不是问题,它只用于测试而不是生产。另一件事是 MCR 需要很长时间才能启动,有没有一种智能/简单的方法来“初始化”MCR,所以第一次调用不会永远(除了虚拟调用)??

以上是关于在从 C# 调用的 Matlab 函数中保存状态的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何保将显示出来的图像保存

matlab,简述脚本M文件和函数M文件的区别?

在c#中调用带参数的matlab函数

在matlab中怎么直接调用函数

如何在 MATLAB 中将 .mat 文件内容保存在内存中?

从 C# 调用函数时的 Matlab 异常(MWMCR::EvaluateFunction 错误)