主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

为 .NET 客户端编写可变长度的输入和输出代码

MATLAB® Production Server™ .NET 客户端支持 MATLAB 处理可变长度输入的功能。有关 vararginvarargout 的完整信息,请参阅 MATLAB 函数参考

将 varargin 与 .NET 客户端结合使用

您使用 C# varargin 关键字传递 MATLAB 变量输入参量(params)。

例如,考虑 MATLAB 函数 varargintest,它接受可变长度的输入(varargin)(包含字符串和整数)并返回 cell 数组(o)。

例 1. MATLAB 函数 varargintest
function o = varargintest(s1, i2, varargin)

o{1} = s1;
o{2} = i2;
idx = 3;
for i=1:length(varargin)
   o{idx} = varargin{i};
   idx = idx+1;
end

C# 接口 VararginTest 实现 MATLAB 函数 varargintest

例 2. C# 接口 VararginTest
public interface VararginTest
{
    object[] varargintest(string s, int i, params object[] objArg);
}

由于您要将输出发送到 MATLAB 中的 cell 数组,因此您可以在接口中定义兼容的 C#数组类型 object[]objArg 定义传递的输入数量 - 在本例中为两个。

C# 方法 TryVarargin 实现 VararginTest,向部署的 MATLAB 函数发送两个字符串和两个整数,作为 cell 数组返回。

例 3. C# 方法 TryVaargin
public static void TryVarargin()
{
    MWClient client = new MWHttpClient();
    VararginTest mpsexample = 
         client.CreateProxy<VararginTest>(new Uri("http://localhost:9910/mpsexample"));
    object[] vOut = mpsexample.varargintest("test", 20, false, new int[]{1,2,3});
    Console.ReadLine();
}

请注意此示例说明的以下最佳编码实践:

将 varargout 与 .NET 客户端结合使用

MATLAB 变量输出参量(varargout)是通过传递 System.Object[] 数组实例获得的。该数组与在 [varargout] 程序集中定义的属性 Mathworks.MATLAB.ProductionServer.Client.dll 一起传递。

在传递 System.Object[] 实例之前,使用调用方法中变量的最大长度初始化 System.Object 数组实例。该数组仅限于一维。

例如,考虑 MATLAB 函数 varargouttest,它接受一个可变长度输入(varargin),并返回一个可变长度输出(varargout),以及两个非可变长度输出(out1out2)。

例 4. MATLAB 函数 varargouttest
functionout [out1 out2 varargout] = varargouttest(in1, in2, varargin)

out1 = modifyinput(in1);
out2 =modifyinput(in2);

for i=1:length(varargin)
    varargout{i} = modifyinput(varargin{i});
end

function out = modifyinput(in)
if ( isnumeric(in) )
    out = in*2;
elseif ( ischar(in) )
    out = upper(in);
elseif ( islogical(in) )
    out = ~in;
else 
    out = in;
end

使用 C# 接口 varargouttest 实现 MATLAB 函数 VarargoutTest

在接口方法 varargouttest 中,定义多个非变长输出(o1o2,使用 out 关键字,在 为 C# .NET 客户端编写多个输出代码 中描述)、一个 double 输入(in1)和一个 char 输入(in2)。

您使用一维数组(具有属性 o3object[])([varargout] 的一个实例)传递可变长度输出(System.Object[])。

将 varargin 与 .NET 客户端结合使用 一样,您可以使用 C# params 关键字来传递可变长度的输入。

例 5. C# 接口 VarargoutTest
public interface VarargOutTest
{
    void varargouttest(out double o1, out string o2, double in1, string in2,
        [varargout]object[] o3, params object[] varargIn);     
}

在调用方法 TryVarargout 中,请注意变量输出(varargOut)的类型和长度都被传递((short)12)。

例 6. C# 方法 TryVarargout
public static void TryVarargout()
{
    MWClient client = new MWHttpClient();
    VarargOutTest mpsexample = 
       client.CreateProxy<VarargOutTest>(new Uri("http://localhost:9910/mpsexample"));

    object[] varargOut = new object[3]; // get all 3 outputs
    double o1;
    string o2;
    mpsexample.varargouttest(out o1, out o2, 1.2, "hello", 
                       varargOut, true, (short)12, "test");

    varargOut = new object[2];  // only get 2 outputs
    double o11;
    string o22;
    mpsexample.varargouttest(out o11, out o22, 1.2, "hello", 
                         varargOut, true, (short)12, "test");
}

注意

确保在将 varargOut 作为输入传递给方法 varargouttest 之前,将其初始化为适当的长度。

请注意此示例说明的以下最佳编码实践: