我试图从C#调用Matlab函数,这不是一个真正的问题,问题是我需要在Matlab部分保持状态,以便在下一次计算中使用以前的结果。此状态应仅存在于Matlab运行时中。
我试过在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();
答案 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池 - 它也做了很多,但它相对昂贵,所以它可能是对你的申请来说太过分了。
或者,您可以随时通过在函数调用之间写入和读取文件来存储状态 - 但这可能会很慢,具体取决于您所在州的大小。