主要内容

调用MATLAB动态功能

动态调用MATLAB®函数时,将函数名指定为调用请求的方法的参数之一。您不需要创建对可部署归档文件的内容建模的已编译接口,如果可部署归档文件中的函数发生了更改,您也不必更改客户机应用程序。

动态调用MATLAB函数:

  1. 实例化一个MWClient实例。

  2. 属性之一创建基于反射的代理对象CreateComponentProxy ()客户端连接方法。

  3. 方法之一调用一个或多个函数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};IList targetTypes = 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向量。

为代理提供封送规则:

  1. 通过扩展实现一组新的封送规则MWDefaultMarshalingRules重写默认值。

  2. 使用以下命令创建代理创建ponentproxy (URL archiveURL, MWMarshallingRules marshalingRules)

可部署的存档studentCheck包括使用MATLAB结构形式的函数

S =名字:“Ed Plum”得分:83分等级:“B+”

客户端代码用一个名为学生.为动态调用中的函数创建封送规则studentChecker,创建一个名为studentMarshaller

类studentMarshaler: MWDefaultMarshalingRules{公共覆盖IList StructTypes() {get{返回新列表 {typeof(学生)};}}}

的动态代理studentCheck通过studentMarshallercreateComponentProxy ()

URL archiveURL =新URL("http://localhost:9910/studentCheck");myProxy = myClient。CreateComponentProxy(archiveURL, new StudentMarshaler());

有关使用MATLAB结构的更多信息,请参见在c#中Marshal MATLAB结构(structs)

有关其他数据封送规则的详细信息,请参见数据转换与c#和MATLAB类型

相关的话题