Code Variable-Length Inputs and Outputs for .NET Client

MATLAB® Production Server™ .NET client supports the MATLAB capability of working with variable-length inputs. See the MATLAB Function Reference for complete information on varargin and varargout.

Using varargin with .NET Client

You pass MATLAB variable input arguments (varargin) using the params keyword.

For example, consider the MATLAB function varargintest, which takes a variable-length input (varargin)—containing strings and integers—and returns an array of cells (o).

MATLAB Function 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

The C# interface VararginTest implements the MATLAB function varargintest.

C# Interface VararginTest

public interface VararginTest
{
    object[] varargintest(string s, int i, params object[] objArg);
}

Since you are sending output to cell arrays in MATLAB, you define a compatible C# array type of object[] in your interface. objArg defines number of inputs passed—in this case, two.

The C# method TryVarargin implements VararginTest, sending two strings and two integers to the deployed MATLAB function, to be returned as a cell array.

C# Method TryVarargin

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();
}

Note the following coding best practices illustrated by this example:

Using varargout with .NET Client

MATLAB variable output arguments (varargout) are obtained by passing an instance of System.Object[] array. The array is passed with the attribute [varargout], defined in the Mathworks.MATLAB.ProductionServer.Client.dll assembly.

Before passing the System.Object[] instance, initialize the System.Object array instance with the maximum length of the variable in your calling method. The array is limited to one dimension.

For example, consider the MATLAB function varargouttest, which takes one variable-length input (varargin), and returns one variable-length output (varargout), as well as two non-variable-length outputs (out1 and out2).

MATLAB Function 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

Implement MATLAB function varargouttest with the C# interface VarargoutTest.

In the interface method varargouttest, you define multiple non-variable-length outputs (o1 and o2, using the out keyword, described in Code Multiple Outputs for C# .NET Client), a double input (in1) and a string input (in2).

You pass the variable-length output (o3) using a single-dimensional array (object[] with attribute [varargout]), an instance of System.Object[].

As with Using varargin with .NET Client, you use the params keyword to pass the variable-length input.

C# Interface VarargoutTest

public interface VarargOutTest
{
    void varargouttest(out double o1, out string o2, double in1, string in2,
        [varargout]object[] o3, params object[] varargIn);     
}

In the calling method TryVarargout, note that both the type and length of the variable output (varargOut) are being passed ((short)12).

C# Method 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");
}

    Note:   Ensure that you initialize varargOut to the appropriate length before passing it as input to the method varargouttest.

Note the following coding best practices illustrated by this example:

  • Both the MATLAB function signature and the C# interface method signature use the name varargouttest. Both MATLAB and C# code are processing a variable-length input, a variable-length output, and two multiple non-variable-length outputs.

  • MATLAB .NET interface supports direct conversion between MATLAB cell arrays and C# object arrays. See Data Conversion with C# and MATLAB Types and Conversion Between MATLAB Types and C# Types for more information.

Was this topic helpful?