Этот пример использует вектор переменного размера, чтобы сохранить значения белого шумового сигнала. Размер вектора может отличаться во время выполнения, потому что значения сигналов сокращены функциями что:
Отфильтруйте значения сигналов, которые не уникальны в заданном допуске друг друга.
Насчитайте каждые два значения сигналов и выведите только получившиеся средние значения.
Откройте модель в качестве примера путем ввода emldemo_process_signal в командной строке MATLAB®. Модель содержит следующие блоки:
| Simulink® Block | Описание |
|---|---|
| Ограниченный полосой Белый шум | Генерирует набор нормально распределенных случайных значений как источник белого шумового сигнала. |
Функция MATLAB uniquify | Отфильтровывает значения сигналов, которые не уникальны для в заданном допуске друг друга. |
Функция MATLAB avg | Выводит среднее значение конкретного количества уникальных значений сигналов. |
| Уникальные значения | Определите объем, который отображает уникальные значения сигналов вывод от функции uniquify. |
| Средние значения | Определите объем, который отображает средние значения сигналов вывод от функции avg. |
Ограниченный полосой белый шумовой сигнал имеет эти свойства:

Размер шумового значения степени задает размер массива, который содержит значения сигналов. Этот массив 1 9 вектор двойных значений.
Этот блок отфильтровывает значения сигналов, которые не являются в допуске 0.2 друг из друга. Вот код:
function y = uniquify(u) %#codegen y = emldemo_uniquetol(u,0.2);
Вызовы функции uniquify внешняя функция MATLAB emldemo_uniquetol, чтобы отфильтровать значения сигналов. uniquify передает 1 9 вектор белых шумовых значений сигналов в качестве первого аргумента и значения допуска в качестве второго аргумента. Вот код для emldemo_uniquetol:
function B = emldemo_uniquetol(A,tol) %#codegen
A = sort(A);
coder.varsize('B',[1 100]);
B = A(1);
k = 1;
for i = 2:length(A)
if abs(A(k) - A(i)) > tol
B = [B A(i)];
k = i;
end
endemldemo_uniquetol возвращает отфильтрованные значения A в выходном векторе B так, чтобы abs(B(i) - B(j)) > tol для всего i и j. Каждый раз, когда Simulink выбирает блок Band-Limited White Noise, он генерирует различный набор случайных значений для A. В результате emldemo_uniquetol может произвести различное количество выходных сигналов в B каждый раз, когда это называется. Чтобы позволить B размещать переменное число элементов, emldemo_uniquetol объявляет его как данные переменного размера с явной верхней границей:
coder.varsize('B',[1 100]);В этом операторе coder.varsize объявляет B как вектор, первая размерность которого фиксируется в 1 и чье второе измерение может вырасти до максимального размера 100. Соответственно, вывод y блока uniquify должен также быть переменным размером так, чтобы это могло передать значения, возвращенные от emldemo_uniquetol до Уникального осциллографа значений. Вот свойства y:

Для переменного размера выходные параметры необходимо задать явный размер и верхнюю границу, показанную здесь как [1 9].
Этот блок средние значения сигналов, отфильтрованные блоком uniquify можно следующим образом:
| Если количество значений сигналов | Блок MATLAB function |
|---|---|
| > 1 и делимый 2 | Составляет в среднем каждую последовательную пару значений |
| > 1, но не делимый 2 | Пропускает первое (наименьшее) значение, и насчитайте остающиеся последовательные пары |
| = 1 | Возвращает неизменное значение |
Функция avg выводит результаты к осциллографу Средних значений. Вот код:
function y = avg(u) %#codegen
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И вход u и вывод y avg объявляются как векторы переменного размера, потому что число элементов отличается в зависимости от того, как функциональный блок uniquify фильтрует значения сигналов. Вход u наследовал свой размер от вывода uniquify.

Вызовы функции avg внешняя функция MATLAB emldemo_navg, чтобы вычислить среднее значение каждых двух последовательных значений сигналов. Вот код для 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Симуляция модели приводит к следующим результатам:
Блок uniquify выводит переменное количество значений сигналов каждый раз, когда он выполняется:

Блок avg выводит переменное количество значений сигналов каждый раз, когда он выполняется — приблизительно половина количества уникальных значений:
