MATLAB怎么⽤命令模块,使⽤MATLABFunction模块创建⾃
定义功能
使⽤ MATLAB Function 模块创建⾃定义功能
此⽰例说明如何创建模型,该模型使⽤ MATLAB
Function 模块来计算值向量的均值和标准差。创建模型
创建⼀个新 Simulink® 模型,并从 User-Defined Functions 库中插⼊⼀个 MATLAB Function 模块。
添加 Constant 模块,并将其值设置为向量 [2 3 4 5]。向模型中添加两个 Display 模块。如图所⽰连接这些模块。
将模型另存为 call_stats_block1。MATLAB Function 模块编程
为模块编程,以计算值向量的均值和标准差:
双击 MATLAB Function 模块。默认函数签名出现在 MATLAB Function 模块编辑器中。在定义的函数签名内编写任何代码。
编辑函数头⾏:
function [mean,stdev] = stats(vals)
从该代码中,您定义了名为 stats 的函数,该函数计算向量 vals 中值的统计均值和标准差。函数头将 vals 声明为 stats 函数的参数,将mean 和 stdev 作为返回值。
在 MATLAB Function 模块编辑器中,在函数头后输⼊⼀⾏空格,然后添加以下代码:
% 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)
matlab定义函数表达式mean = sum(array)/size;
将模型另存为 call_stats_block2。编译函数并检查错误
在 Simulink 模型中进⾏模块编程后,可以编译函数并测试是否有错误。编译 MATLAB Function 模块需要使⽤⽀持的编译器。
MATLAB® 会⾃动选择⼀个编译器作为默认编译器。如果您的系统上安装了多个受 MATLAB ⽀持的编译器,您可以使⽤ mex -setup 命令更改默认编译器。请参阅更改默认编译器。⽀持仿真编译和代码⽣成编译的编译器
查看⽤于编译包含 MATLAB Function 模块的模型的编译器列表,其中分为⽤于仿真和代码⽣成两种情形。
滚动⾄ Simulink 产品系列下的表。
如果包含 MATLAB Function 模块的模型是⽤于仿真,请在标题为 Simulink For Model Referencing, Accelerator mode, Rapid Accelerator mode, and
MATLAB Function blocks 的列中查打勾的编译器。
如果包含 MATLAB Function 模块的模型要⽣成代码,请在标题为 Simulink
Coder™ 的列中查打勾的编译器。代码⽣成⽀持的编译器
要为包含 MATLAB Function 模块的模型⽣成代码,可将 Simulink 软件⽀持的任何 C 编译器与 Simulink Coder 结合使⽤以进⾏代码⽣成。要查看这些编译器的列表,请执⾏以下操作:
选择您的平台。
在针对 Simulink 和相关产品的表格中,在标题为 Simulink Coder 的列中查打勾的编译器。定位并修复错误。
如果编译过程中出现错误,Diagnostics Viewer 窗⼝将列出错误,并提供指向违规代码的链接。
以下练习显⽰在 MATLAB Function 模块中定位和修复错误的⽅法。
在 stats 函数中,将局部函数 avg 更改为虚构的局部函数 aug,然后再次编译,即可在窗⼝中看到以下消息。Diagnostics Viewer 窗⼝⽤红线显⽰每个检测到的错误。
调查标题为 Undefined function or variable
'aug' 的错误。在所选错误的诊断消息中,点击函数名称后⾯的蓝⾊链接,以显⽰有问题的代码。有问题的代码⾏在 MATLAB Function Block Editor 中突出显⽰。
该消息还链接⼀个报告,提供有关 MATLAB 函数中的变量和表达式的编译时类型信息。此信息可帮助您诊断错误消息并了解类型传播规则。有关该报告的详细信息,请参阅 MATLAB Function Reports。要查看报告,请点击名为 Launch diagnostic report 的⾏中突出显⽰的蓝⾊链接。
通过将 aug 改回 avg 并重新编译来纠正错误。定义输⼊和输出
默认情况下,函数输⼊和输出从其端⼝连接的信号继承数据类型和⼤⼩。检查 MATLAB
Function 模块的输⼊和输出数据,以验证它们是否继承了正确的类型和⼤⼩。
双击 MATLAB Function 模块 stats。
在 MATLAB Function 模块编辑器中,选择 Edit Data。Ports and Data Manager 将打开,帮助您定义 MATLAB Function 模块的参数。
左窗格显⽰您已经为 MATLAB Function 模块创建的参数 vals 以及返回值 mean 和 stdev。注意为 vals 指定的 Scope 是 Input,即Input from Simulink 的简写。为 mean 和 stdev 指定的 Scope 是 Output,即 Output to Simulink 的简写。
在 Ports and Data Manager 的左窗格中,在 vals ⾏中的任意位置点击以突出显⽰。
右窗格显⽰ vals 的 Data 属性对话框。默认情况下,输⼊和输出参数的类、⼤⼩、单位以及复/实性从每个输⼊或输出端⼝连接的信号继承⽽来。通过将 Size 设置为 -1,将 Complexity 设置为 Inherited 并将 Type 设置为 “Inherit:Same as Simulink”,即可指定继承。
⼤⼩和类型的实际继承值是在模型编译时设置的,并显⽰在左窗格中的 Compiled Type 和 Compiled Size 列。
您可以在 Data 属性对话框的 Type 字段中指定输⼊或输出参数的类型,例如 double。还可以通过在 Size 字段中输⼊表达式来指定输⼊或输出参数的⼤⼩。例如,您可以在 Size 字段中输⼊ [2 3],将 vals 指定为 2×3 矩阵。有关可输⼊的类型和⼤⼩表达式的详细信息,请参阅指定函数参数类型和指定函数参数⼤⼩。
注意
在您为 MATLAB
Function 模块函数添加的任何数组中,第⼀个索引都默认为 1,就像在 MATLAB 中⼀样。创建 MATLAB Function 对象和查询属性
您可以为您模型中的 MATLAB Function 模块创建对象,并修改属于该模型的属性。要查询您刚刚创建的 call_stats_block2 模型中的属性,请创建配置对象。
myconfig = get_param('call_stats_block2/MATLAB Function', 'MATLABFunctionConfiguration')
myconfig =
MATLABFunctionConfiguration with properties:
Path: 'call_stats_block2/MATLAB Function'
FunctionScript: 'function [mean,stdev] = stats(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;↵'
UpdateMethod: Inherited
SampleTime: '-1'
Description: ''
DocumentLink: ''
SupportVariableSizing: 1
AllowDirectFeedthrough: 1
SaturateOnIntegerOverflow: 1
TreatAsFi: FixedPoint
FimathMode: SameAsMATLAB
Fimath:
'fimath('RoundingMethod','Nearest','OverflowAction','Saturate','ProductMode','FullPrecision','SumMode','FillPrecision')'要
更改配置对象中的任何属性,请对对象名称使⽤圆点表⽰法。例如,要将说明更改为此模型中的 MATLAB Function 模块:
myconfig.Description = 'This model outputs the mean and standard deviation values of an array'要了解有关您可以在 MATLAB Function 配置对象中修改的属性的详细信息,请参阅 MATLABFunctionConfiguration。为代码⽣成定义局部变量
要从 MATLAB Function 模块中的 MATLAB 算法⽣成代码,则必须⾸先显式指定局部变量的类、⼤⼩和复/实性,然后才能在运算中使⽤这些局部变量或将它们作为输出返回(请参阅Data Definition for Code Generation)。在⽰例函数 stats 中,局部变量 len 是在⽤于计算均值和标准差之前定义的:
len = length(vals);
⼀旦将属性赋给变量,就不能在函数体中的其他地⽅重新定义变量的类、⼤⼩或复/实性,但有例外情况(请参阅Reassignment of Variable Properties)。为 MATLAB Function 模块⽣成代码
打开您在MATLAB Function 模块编程的最后保存的 call_stats_block2 模型。
双击 stats 模块。
选择 Build Model > Build 以编译和构建⽰例模型。
如果出现与 “Variable-step” 求解器相关的错误,请在 Configuration Parameters > Solver 中将求解器类型更改为 “Fixed-step”求解器,然后重新运⾏编译。要了解固定步长和可变步长求解器之间区别的更多信息,请参阅 固定步长和可变步长求解器。
如果没有发⽣错误,Diagnostics Viewer 窗⼝将显⽰⼀条表⽰成功的消息。否则,此窗⼝可帮助您定位错误,如定位并修复错误。中所述。以编程⽅式将代码添加到 MATLAB Function 模块
此⽰例说明如何以编程⽅式将 MATLAB
Function 模块添加到模型中,并⽤ MATLAB 代码填充该模块。如果您已有 MATLAB 代码,并且不想⼿动将其添加到 MATLAB Function 模块中,此⼯作流可能会很⽅便。
创建并保存名为 myModel 的模型。
使⽤以下代码创建⼀个 MATLAB function,并将其保存在 myAdd.m 中。
function c = myAdd(a, b)
c = a + b;
编写⼀个 MATLAB 脚本,它将 MATLAB Function 模块添加到 myModel 中,并在其中填充 myAdd.m 的内容。% Add a MATLAB Function block to a model and populate the block with MATLAB
% code.
%
% Copyright 2018 The Mathworks, Inc.
open_system('myModel.slx');
libraryBlockPath = 'simulink/User-Defined Functions/MATLAB Function';
newBlockPath = 'myModel/myBlockName';
% Add a MATLAB Function to the model
add_block(libraryBlockPath, newBlockPath);
% In memory, open models and their parts are represented by a hierarchy of
% objects. The root object is slroot. This line of the script returns the
% object that represents the new MATLAB Function block:
blockHandle = find(slroot, '-isa', 'Stateflow.EMChart', 'Path', newBlockPath);
% The Script property of the object contains the contents of the block,
% represented as a character vector. This line of the script loads the
% contents of the file myAdd.m into the Script property:
blockHandle.Script = fileread('myAdd.m');
% Alternatively, you can specify the code directly in a character vector.
% For example:
% blockHandle.Script = 'function c = fcn (a, b)';
运⾏该脚本,观察 myModel 中的新 MATLAB Function 模块。
要查看您添加到模块中的代码,请双击 myBlockName 模块。
另请参阅
相关主题