声明可变大小的 MATLAB Function 模块变量
如果启用支持可变大小数组模块属性,则 MATLAB Function 模块支持在仿真期间更改大小的变量。请参阅Support variable-size arrays。但是,在仿真期间,只有指定为可变大小的变量才可以更改大小。根据作用域,您可以通过使用 MATLAB Function 模块编辑器、使用 coder.varsize
函数或从连接的模块信号继承大小可变性,将变量设置为可变大小。有关作用域的详细信息,请参阅Scope。
输出变量
默认情况下,输出变量的大小不可变。要将输出指定为可变大小,请执行以下操作:
双击 MATLAB Function 模块以打开 MATLAB Function 模块编辑器。
打开符号窗格和属性检查器。在函数选项卡中,点击编辑数据。
在符号窗格中,选择输出变量。
在属性检查器的属性选项卡中,选择可变大小属性。
在大小属性中,将大小指定为上界。例如,要将 2×4 矩阵指定为可接受的最大大小,请输入
[2 4]
。如果您不知道大小的上界,请使用Inf
作为上界来创建一个无界可变大小数组。 (自 R2023b 起)有关详细信息,请参阅自定义可变大小和Unbounded Variable-Size Signals。
其他作用域类型
输入变量从其连接的信号中继承大小。因此,不要将输入变量显式定义为可变大小。输入变量也可以是无界的。有关创建可变大小信号的详细信息,请参阅可变大小信号基础知识。
如果变量不是输入或输出变量,请使用 coder.varsize
函数定义变量。请参阅使用 coder.varsize 显式定义可变大小数据。
在滤波算法中使用可变大小信号
此示例使用可变大小的向量来存储白噪声信号的值。
向量的大小可以在运行时变化,因为函数通过以下方式对信号值进行剪枝:
滤除在彼此指定的容差内不唯一的信号值。
对每两个信号值取平均值并仅输出生成的均值。
在此模型中,Band-Limited White Noise 模块生成一组正态分布的随机值作为白噪声信号源。MATLAB Function 模块 Filter
滤除在指定容差范围内不唯一的信号值。然后,MATLAB Function 模块 Average
输出指定数量的唯一信号值的平均值。Scope 模块显示 Filter
和 Average
模块的输出。打开模型以查看配置。
检查源信号
打开 Band-Limited White Noise 模块以查看源信号的属性。噪声功率参数的大小定义存储信号值的数组的大小。此数组是由双精度值组成的 1×9 向量。
检查 Filter
MATLAB Function 模块
打开 Filter
以检查滤波函数。Filter
滤除不在彼此的 0.2
容差范围内的唯一信号值。该函数调用外部 MATLAB® 函数文件 emldemo_uniquetol.m
以对信号值进行滤波。该函数将由白噪声信号值组成的 1×9 向量作为第一个参数传递,将容差值作为第二个参数传递。
function y = uniquify(u)
y = emldemo_uniquetol(u,0.2);
打开 MATLAB 函数文件 emldemo_uniquetol.m
以查看外部函数 emldemo_uniquetol
的代码。emldemo_uniquetol
返回输出向量 B
中 A
的滤波后的值,使得所有 i
和 j
都满足 abs(B(i) - B(j)) > tol
。
function B = emldemo_uniquetol(A,tol) %#codegen
A = sort(A); B = A(1); k = 1; for i = 2:length(A) if abs(A(k) - A(i)) > tol B = [B A(i)]; k = i; end end
在每个时间步,Band-Limited White Noise 模块为 A
生成不同随机值集合,并且 emldemo_uniquetol
可以在 B
中产生不同数量的输出信号。因此,y
的大小必须可变。为了使 y
成为可变大小,您必须启用可变大小属性。在此示例中,为 y
启用了可变大小。在 Filter
中,打开符号窗格和属性检查器。在函数选项卡中,点击编辑数据。在符号窗格中,点击 y
以在属性检查器中查看属性。对于可变大小输出,您必须将大小属性指定为最大大小上界。在此示例中,大小为 [1 9]
。
检查 Average
MATLAB Function 模块
Average
按照以下条件对 Filter
滤波后的值取平均值:
如果信号的数量大于
1
并且可被2
整除,则Average
对每对连续的值取平均值。如果信号的数量大于
1
但无法被2
整除,则Average
会丢弃第一个值,并对其余连续值对取平均值。如果恰好只有一个信号,则
Average
按原样返回值。
打开 Average
以查看代码。
function y = avg(u)
if numel(u) == 1 y = u; else k = numel(u)/2; if k ~= floor(k) u = u(2:numel(u)); end y = emldemo_navg(u,2); end
avg
函数调用外部 MATLAB 函数 emldemo_navg
来计算每两个连续信号值的平均值。
function B = emldemo_navg(A,n) %#codegen
assert(n>=1 && n<=numel(A));
B = zeros(1,numel(A)/n); k = 1; for i = 1 : numel(A)/n B(i) = mean(A(k + (0:n-1))); k = k + n; end
u
和 y
的大小均可变。您不需要显式将 u 定义为可变大小,因为 u
是输入。输出 y
声明为可变大小的向量,因为元素的数量根据 u
提供的大小而变化。检查 y
的属性,确认它是可变大小的。
对模型进行仿真
仿真模型以查看每个 Scope 模块中的结果。Filter
在每次执行时输出不定数量的信号值。
Average
在每次执行时输出不定数量的信号值。该模块返回大约一半的唯一值。