为 .NET 客户端编写可变长度的输入和输出代码
MATLAB® Production Server™ .NET 客户端支持 MATLAB 处理可变长度输入的功能。有关 varargin 和 varargout 的完整信息,请参阅 MATLAB 函数参考。
将 varargin 与 .NET 客户端结合使用
您使用 C# varargin 关键字传递 MATLAB 变量输入参量(params)。
例如,考虑 MATLAB 函数 varargintest,它接受可变长度的输入(varargin)(包含字符串和整数)并返回 cell 数组(o)。
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。
public interface VararginTest
{
object[] varargintest(string s, int i, params object[] objArg);
}
由于您要将输出发送到 MATLAB 中的 cell 数组,因此您可以在接口中定义兼容的 C#数组类型 object[]。objArg 定义传递的输入数量 - 在本例中为两个。
C# 方法 TryVarargin 实现 VararginTest,向部署的 MATLAB 函数发送两个字符串和两个整数,作为 cell 数组返回。
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();
}
请注意此示例说明的以下最佳编码实践:
MATLAB 函数签名和 C# 接口方法签名都使用名称
varargintest。MATLAB 和 C# 代码都在处理两个可变长度的输入,字符串和整数。MATLAB .NET 接口支持 MATLAB 元胞数组和 C# 对象数组之间的直接转换。有关更多信息,请参阅 使用 C# 和 MATLAB 类型进行数据转换 和 MATLAB 类型与 C# 类型之间的转换。
将 varargout 与 .NET 客户端结合使用
MATLAB 变量输出参量(varargout)是通过传递 System.Object[] 数组实例获得的。该数组与在 [varargout] 程序集中定义的属性 Mathworks.MATLAB.ProductionServer.Client.dll 一起传递。
在传递 System.Object[] 实例之前,使用调用方法中变量的最大长度初始化 System.Object 数组实例。该数组仅限于一维。
例如,考虑 MATLAB 函数 varargouttest,它接受一个可变长度输入(varargin),并返回一个可变长度输出(varargout),以及两个非可变长度输出(out1 和 out2)。
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 中,定义多个非变长输出(o1 和 o2,使用 out 关键字,在 为 C# .NET 客户端编写多个输出代码 中描述)、一个 double 输入(in1)和一个 char 输入(in2)。
您使用一维数组(具有属性 o3 的 object[])([varargout] 的一个实例)传递可变长度输出(System.Object[])。
与 将 varargin 与 .NET 客户端结合使用 一样,您可以使用 C# params 关键字来传递可变长度的输入。
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)。
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 之前,将其初始化为适当的长度。
请注意此示例说明的以下最佳编码实践:
MATLAB 函数签名和 C# 接口方法签名都使用名称
varargouttest。MATLAB 和 C# 代码都在处理可变长度的输入、可变长度的输出和两个多个非可变长度的输出。MATLAB .NET 接口支持 MATLAB 元胞数组和 C# 对象数组之间的直接转换。有关更多信息,请参阅 使用 C# 和 MATLAB 类型进行数据转换 和 MATLAB 类型与 C# 类型之间的转换。