Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

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

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

输出变量

默认情况下,输出变量的大小不可变。要将输出指定为可变大小,请执行以下操作:

  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. 打开符号窗格和属性检查器。在函数选项卡中,点击编辑数据

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

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

  5. 大小属性中,将大小指定为上界。例如,要将 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 模块显示 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 在每次执行时输出不定数量的信号值。该模块返回大约一半的唯一值。

另请参阅

相关主题