# MATLAB Function

Include MATLAB code in Simulink models

Libraries:
HDL Coder / User-Defined Functions

## Description

With a MATLAB Function block, you can write a MATLAB® function for use in a Simulink® model. The MATLAB function executes for simulation and generates code for a Simulink Coder™ target. If you are new to Simulink and MATLAB products, see Implement MATLAB Functions in Simulink with MATLAB Function Blocks for an overview.

Double-clicking the MATLAB Function block opens the MATLAB Function Block Editor, where you write the MATLAB function. The example model call_stats_block2 discussed in Implement MATLAB Functions in Simulink with MATLAB Function Blocks uses the following function in the MATLAB Function Block Editor:

function [mean,stdev] = stats(vals)

% Calculates a statistical mean and a standard
% deviation for the values in vals.

len = length(vals);
mean = avg(vals,len);
stdev = sqrt(sum(((vals-avg(vals,len)).^2))/len);
plot(vals,"-+");

function mean = avg(array,size)
mean = sum(array)/size;

The function specifies the input and output data in the function declaration statement as arguments and return values. The argument and return values of the preceding example function correspond to the inputs and outputs of the block in the call_stats_block2 model.

You can also define variables, add an input trigger, and create function call outputs by using the Model Explorer or the Symbols pane. For more information, see Create and Define MATLAB Function Block Variables, Manage the Input Trigger of a MATLAB Function Block, and Manage Function Call Outputs of a MATLAB Function Block.

The MATLAB Function block generates efficient embeddable code based on an analysis that determines the size, class, and complexity of each variable. This analysis imposes the following restrictions:

• The first assignment to a variable defines its, size, class, and complexity.

• You cannot reassign variable properties after the initial assignment except when using variable-size data or reusing variables in the code for different purposes.

In addition to language restrictions, the MATLAB Function block supports a subset of the functions available in MATLAB. These functions include functions in common categories, such as:

For more information, see Functions and Objects Supported for C/C++ Code Generation.

Note

Although the code for this block attempts to produce exactly the same results as MATLAB, differences might occur due to rounding errors. These numerical differences, which might be a few eps initially, can magnify after repeated operations. Reliance on the behavior of nan is not recommended. Different C compilers can yield different results for the same computation.

Note

New MATLAB Function blocks do not include the %#codegen directive, but check for errors as if it is included. Adding the %#codegen directive to a MATLAB Function block does not affect error checking. For more information see Compilation Directive %#codegen.

To support visualization of data, the MATLAB Function block supports calls to MATLAB functions for simulation only. See Use MATLAB Engine to Execute a Function Call in Generated Codein MATLAB Function BlocksDuring Fixed-Point Algorithm Acceleration to understand some of the limitations of this capability, and how it integrates with code analysis for this block. If these function calls do not directly affect any of the Simulink inputs or outputs, the calls do not appear in Simulink Coder generated code.

From MATLAB Function blocks, you can also call functions defined in a Simulink Function block. You can call Stateflow® functions with Export Chart Level Functions (Make Global) and Allow exported functions to be called by Simulink checked in the chart Properties dialog box.

In the Symbols pane, you can declare a block input to be a Simulink parameter instead of a port. The MATLAB Function block also supports inheritance of types and size for inputs, outputs, and parameters. You can also specify these properties explicitly. See Define and Modify Variable Data Types, Specify Size of MATLAB Function Block Variables, and Configure MATLAB Function Block Parameter Variables for descriptions of variables that you use in MATLAB Function blocks.

Recursive calls are not allowed in MATLAB Function blocks.

By default, MATLAB Function blocks have direct feedthrough enabled. To disable it, clear the Allow direct feedthrough property. Nondirect feedthrough semantics ensure that outputs rely only on the current state. Using nondirect feedthrough enables you to use MATLAB Function blocks in a feedback loop and prevent algebraic loops. For more information, see Use Nondirect Feedthrough in a MATLAB Function Block.

## Examples

expand all

Add a MATLAB Function to your model to modify an input signal.

1. In the Simulation tab, click . Select Simulink > User-Defined Functions. Drag a MATLAB Function block to the Simulink canvas.

2. Double-click the block to open the MATLAB Function Block Editor. Replace the function body code with the following:

y = 2*u;
3. Return to the model by clicking the Up to Parent button . Add a Sine Wave block as the input signal and add a Scope block to capture the input and output of the MATLAB Function block.

4. Run the simulation and open the Scope block to see the effects of the code.

## Ports

### Input

expand all

Input port, specified as a scalar, vector, or matrix. Each input variable that you create has a corresponding input port.

Data types supported by MATLAB but not supported by Simulink may not be passed between the Simulink model and the function within the MATLAB Function block. These types may be used within the MATLAB Function block.

For more information on fixed-point support for this block, refer to Fixed-Point Data Types with MATLAB Function Block (Fixed-Point Designer) and Data Type Override with MATLAB Function Block (Fixed-Point Designer).

#### Dependencies

To create input ports, open the block and create input variables in the Symbols pane. See Create and Define MATLAB Function Block Variables.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | string | fixed point | enumerated | bus

### Output

expand all

Output port, specified as a scalar, vector, or matrix. Each output variable that you create has a corresponding output port.

#### Dependencies

To create output ports, open the block and create output variables in the Symbols pane. See Create and Define MATLAB Function Block Variables.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | string | fixed point | enumerated | bus

## Parameters

expand all

### Main

Select how to display port labels on the MATLAB Function block icon.

• none — Do not display port labels.

• FromPortIcon — Display the name of the input and output variables.

• FromPortBlockName — Display the name of the input and output variables.

• SignalName — If the signal connected to the port is named, display the signal name. Otherwise, display the name of the variables.

#### Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

 Parameter: ShowPortLabels Values: "FromPortIcon" (default) | "none" | "FromPortBlockName" | "SignalName"

• ReadWrite — Enable opening and modifying of MATLAB Function block contents.

• ReadOnly — Enable opening of the MATLAB Function block.

• NoReadOrWrite — Disable opening or modifying of the MATLAB Function block.

Note

When you attempt to view the contents of a MATLAB Function block whose Read/Write permissions parameter is NoReadOrWrite, the block does not respond. For example, when you double-click the MATLAB Function block, Simulink does not open the block and does not display messages.

#### Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

Whether the block attempts to eliminate artificial algebraic loops that include the block.

• off — Do not try to eliminate any artificial algebraic loops that include the block.

• on — Try to eliminate any artificial algebraic loops that include the block.

#### Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

 Parameter: MinAlgLoopOccurrences Values: "off" (default) | "on"

Specify whether variables in this block must run at the same rate or can run at different rates.

• If variables in the MATLAB Function block can run at different rates, specify the sample time as inherited (-1).

• If variables must run at the same rate, specify the sample time, Ts, corresponding to this rate.

#### Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

 Parameter: SystemSampleTime Values: "-1" (default) | "[Ts 0]" Data Types: char | string

### Code Generation

Select the code format that the block generates.

• AutoSimulink Coder chooses the optimal format for your system based on the type and number of instances of the MATLAB Function block that exist in the model.

• InlineSimulink Coder inlines the MATLAB Function block unconditionally.

• Nonreusable functionSimulink Coder explicitly generates a separate function in a separate file. MATLAB Function blocks with this setting generate functions that might have arguments depending on the Function interface parameter setting. You can name the generated function and file using the Function name and File name (no extension) parameters respectively. These functions are not reentrant.

• Reusable functionSimulink Coder generates a function with arguments that allows reuse of MATLAB Function block code when a model includes multiple instances of the MATLAB Function block.

This option generates a function with arguments that allows MATLAB Function block code to be reused in the generated code of a model reference hierarchy that includes multiple instances of a MATLAB Function block across referenced models. In this case, the MATLAB Function block must be in a library.

#### Tips

• When you want to represent multiple instances of a MATLAB Function block as one reusable function, you can designate each of the instances as Auto or as Reusable function. Use one or the other, as using both creates two reusable functions, one for each designation. The outcomes of these choices differ only when reuse is not possible. Selecting Auto does not allow control of the function or file name for the MATLAB Function block code.

• The Reusable function and Auto options both determine whether multiple instances of a MATLAB Function block exist and the code can be reused. The options behave differently when it is impossible to reuse the code.

• Auto yields inlined code, or if circumstances prohibit inlining, separate functions for each MATLAB Function block instance.

• Reusable function yields a separate function with arguments for each MATLAB Function block instance.

• If you select Reusable function while your generated code is under source control, set File name options to Use subsystem name, Use function name, or User specified. Otherwise, the names of your code files change when you modify your model, which prevents source control on your files.

#### Dependencies

• This parameter requires Simulink Coder.

• Setting this parameter to Nonreusable function or Reusable function enables the following parameters:

• Function name options

• File name options

• Memory section for initialize/terminate functions (requires Embedded Coder® and an ERT-based system target file)

• Memory section for execution functions (requires Embedded Coder and an ERT-based system target file)

#### Programmatic Use

To set the block parameter value programmatically, use the set_param function.

To get the block parameter value programmatically, use the get_param function.

 Parameter: RTWSystemCode Values: "Auto" (default) | "Inline" | "Nonreusable function" | "Reusable function"

## Block Characteristics

 Data Types Booleana | busa | doublea | enumerateda | fixed pointa | halfa | integera | singlea | stringa Direct Feedthrough yesa Multidimensional Signals yesa Variable-Size Signals yesa Zero-Crossing Detection no a Actual data type or capability support depends on block implementation.

## Version History

Introduced in R2011a

expand all