主要内容

声明可变大小的 MATLAB Function 模块变量

如果启用支持可变大小数组模块属性,则 MATLAB Function 模块支持在仿真期间更改大小的变量。请参阅支持可变大小数组。但是,在仿真期间,只有指定为可变大小的变量才可以更改大小。根据作用域,您可以通过使用 MATLAB Function 模块编辑器、使用 coder.varsize 函数或从连接的模块信号继承大小可变性,将变量设置为可变大小。有关作用域的详细信息,请参阅Scope

输出变量

默认情况下,输出变量的大小不可变。要将输出指定为可变大小,请使用符号窗格和属性检查器 (自 R2022a 起)

  1. 双击 MATLAB Function 模块以打开 MATLAB Function 模块编辑器

    This image shows the MATLAB Function Block Editor that opens for a new MATLAB Function block. The Function tab is selected in the Simulink Editor.

  2. 函数选项卡中,点击编辑数据以打开符号窗格和属性检查器

    The Function tab in the Simulink Editor while the MATLAB Function block Editor is open. The Edit Data button on the left is enclosed in a red box.

  3. 符号窗格中,选择输出变量。

  4. 属性检查器属性选项卡中,选择可变大小属性。

  5. 大小属性中,将大小指定为上界。例如,要将 2×4 矩阵指定为可接受的最大大小,请输入 [2 4]如果您不知道大小的上界,请使用 Inf 作为上界来创建一个无界可变大小数组。 (自 R2023b 起)有关详细信息,请参阅自定义可变大小Unbounded Variable-Size Signals

其他作用域类型

输入变量从其连接的信号中继承大小。因此,不要将输入变量显式定义为可变大小。输入变量也可以是无界的。有关创建可变大小信号的详细信息,请参阅可变大小信号基础知识

如果变量不是输入或输出变量,请使用 coder.varsize 函数定义变量。请参阅可变大小数组的代码生成 (MATLAB Coder)

在滤波算法中使用可变大小信号

此示例使用可变大小的向量来存储白噪声信号的值。

向量的大小可以在运行时变化,因为函数通过以下方式对信号值进行剪枝:

  • 滤除在彼此指定的容差内不唯一的信号值。

  • 对每两个信号值取平均值并仅输出生成的均值。

在此模型中,Band-Limited White Noise 模块生成一组正态分布的随机值作为白噪声信号源。MATLAB Function 模块 Filter 滤除在指定容差范围内不唯一的信号值。然后,MATLAB Function 模块 Average 输出指定数量的唯一信号值的平均值。Scope 模块显示 FilterAverage 模块的输出。打开模型以查看配置。

检查源信号

打开 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 返回输出向量 BA 的滤波后的值,使得所有 ij 都满足 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

uy 的大小均可变。您不需要显式将 u 定义为可变大小,因为 u 是输入。输出 y 声明为可变大小的向量,因为元素的数量根据 u 提供的大小而变化。检查 y 的属性,确认它是可变大小的。

对模型进行仿真

仿真模型以查看每个 Scope 模块中的结果。Filter 在每次执行时输出不定数量的信号值。

Average 在每次执行时输出不定数量的信号值。该模块返回大约一半的唯一值。

另请参阅

主题