调用MATLAB动态功能
动态调用MATLAB®函数时,将函数名指定为调用请求的方法的参数之一。您不需要创建对可部署归档文件的内容建模的已编译接口,如果可部署归档文件中的函数发生了更改,您也不必更改客户机应用程序。
动态调用MATLAB函数:
实例化一个
MWClient
实例。属性之一创建基于反射的代理对象
CreateComponentProxy ()
客户端连接方法。方法之一调用一个或多个函数
Invoke ()
基于反射的代理方法。
创建基于反射的代理
基于反射的代理实现MWInvokable
接口,并提供了允许您直接调用作为可部署归档的一部分部署的任何MATLAB函数的方法。与基于接口的代理一样,基于反射的代理是从MWClient
对象。的MWClient
接口有两种方法来创建基于反射的代理:
MWInvokable CreateComponentProxy(URL archiveURL)
创建使用标准MATLAB数据类型的代理。MWInvokable CreateComponentProxy(URL archiveURL, MWMarshallingRules)
创建使用结构的代理。
方法中调用函数的基于反射的代理myMagic
存档,托管在您的本地计算机上:
MWClient myClient = new MWHttpClient();Uri archiveURL =新Uri("http://localhost:9910/myMagic");MWInvokable myProxy = myClient.CreateComponentProxy(archiveURL);
调用MATLAB动态代理函数
动态代理有三种方法来调用服务器上的函数:
对象[]调用(string functionName, IList
调用返回多个值的函数。targetTypes, params对象[]输入) T调用
调用返回单个值的函数。(string functionName, params Object[]输入) 调用(string functionName, params Object[] input)
调用不返回值的函数。
所有的方法映射到MATLAB函数如下:
第一个参数是函数名
最后一个参数是函数输入
返回多个输出
MATLAB函数myLimits
返回两个值。
函数[myMin,myMax] = myLimits(myRange) myMin = min(myRange);myMax = max(myRange);结束
调用myLimits
从。net客户端,使用Invoke ()
方法,该方法接受目标类型的列表:
double[] myRange = new double[]{2,5,7,100,0.5};IListtargetTypes = new List {typeof(double), typeof(double)};对象[]myLimits = myProxy。调用("myLimits", targetTypes, myRange); double myMin = myLimits[0]; double myMax = myLimits[1]; Console.WriteLine("min: {0:f} max: {1:f}", myMin, myMax);
这种形式Invoke ()
总是返回对象[]
.类型的内容为返回数组的内容的类型targetType
.
返回单个输出
MATLAB函数addmatrix
返回单个值。
函数A = addmatrix(a1, a2) A = a1 + a2;
调用addmatrix
从。net客户端,使用Invoke ()
方法,该方法不接受返回参数的个数:
Double [,] a1 = new Double [,] {{1,2,3},{3,2,1}};Double [,] a2 = new Double [,] {{4,5,6},{6,5,4}};对象[]inputs = new对象[2];输入[0]= a1;输入[1]= a2;double[,] result = myProxy。调用("addmatrix", inputs); // display the result
无输出
MATLAB函数喷火
不返回值。
函数foo (a1)分钟(a1);
调用喷火
从。net客户端,使用Invoke ()
返回void的方法:
Double [,] a = new Double [,] {{1,2,3},{3,2,1}};myProxy。调用("foo", a);
创建自定义封送规则
如果出现以下情况,您需要为基于反射的代理提供自定义封送规则:
可部署归档中的任何MATLAB函数都使用结构
可部署归档中的任何MATLAB都需要自定义默认封送规则设置。
有默认的封送规则
南
,DateTime
, . net null, 1xN向量,Nx1向量。
为代理提供封送规则:
通过扩展实现一组新的封送规则
MWDefaultMarshalingRules
重写默认值。使用以下命令创建代理
创建ponentproxy (URL archiveURL, MWMarshallingRules marshalingRules)
.
可部署的存档studentCheck
包括使用MATLAB结构形式的函数
S =名字:“Ed Plum”得分:83分等级:“B+”
客户端代码用一个名为学生
.为动态调用中的函数创建封送规则studentChecker
,创建一个名为studentMarshaller
.
类studentMarshaler: MWDefaultMarshalingRules{公共覆盖IListStructTypes() {get{返回新列表 {typeof(学生)};}}}
的动态代理studentCheck
通过studentMarshaller
来createComponentProxy ()
.
URL archiveURL =新URL("http://localhost:9910/studentCheck");myProxy = myClient。CreateComponentProxy(archiveURL, new StudentMarshaler());
有关使用MATLAB结构的更多信息,请参见在c#中Marshal MATLAB结构(structs).
有关其他数据封送规则的详细信息,请参见数据转换与c#和MATLAB类型.