在从 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 函数中保存状态的主要内容,如果未能解决你的问题,请参考以下文章