Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Создание подпрограмм с переменным списком входных и выходных параметров




При создании функций со специальными свойствами весьма полезны две приведенные ниже функции:

· nargin — возвращает число входных параметров данной функции;

· nargout — возвращает число выходных параметров данной функции.

Пусть есть функция, вычисляющая сумму квадратов пяти аргументов:

function f=sum_5(x1,x2,x3,x4,x5) ;

f=x1^2+x2^2+x3^2+x4*2+x5^*2;

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

>> sum_5(l,2.3.4.5)

ans = 55

Если обратится к функции, задав не полный список переменных (только два) то система выдаст сообщение об ошибке:

>> sum_5(l,2)

??? Input argument 'хЗ' is undefined.

Error in ==> C:\MATI_AB\Work\sum_5.m

On line 2 ==> f=xl"2+x2"2+x3"2+x4"2+x5"2;

С помощью функции nargin можно создать функцию sum_5.m, которая работает корректно при любом числе заданных входных аргументов в пределах от 1 до 5:

function f=sum_5(xl . x2 , хЗ . x4 , x5) ;

n=nargin;

switch n

case n==1, f=xl^2;

case n==2, f=xl^2+x2^2;

case n==3, f=xl^2+x2^2+x3^2;

case n==4, f=xl^2+x2^2+x3^2+x4^2:

case n==5, f=xl^2+x2^2+x3^2+x

end

Использование функции nargin и условного оператора switch позволяет организовать вычисления по формуле с числом слагаемых, равным числу входных аргументов — от одного до пяти:

>> sum_5m(l)

ans = 1

>> sum_5m(l,2)

ans = 5

>> sum2_5m( 1,2,3)

ans = 14

Для упрощения записи аргументов функций используются функции varargin иvarargout, которые позволяют передавать произвольное количество входных и выходных аргументов:

- varargout = name(n) – возвращает список выходных параметров переменной длины функции name;

- y = function name(varargin) – принимает переменное число аргументов в функцию name.

Система MATLAB упаковывает все заданные входные и выходные аргументы в массив ячеек. Каждая ячейка может содержать любой тип и любое количество данных. Переменные varargin и varargout используются только внутри M-файлов функции для задания произвольных аргументов функции. Эти переменные должны быть последними в списке входов или выходов, а для их обозначения могут использоваться только строчные буквы.

Следует отметить, что можно комбинировать наборы фиксированных входных данных, и наборы переменной длинны.

Пример.

Создадим М-файл с функцией, которая содержит два фиксированных входных значения: argA, argB и допускает ввод дополнительных переменных. Если список дополнительных переменных не пуст, то он считывается в массив х и вычисляется сумма фиксированных и дополнительных переменных.

function vartest(A, B, varargin) % заголовок функции

dopvar = size(varargin,2); % определение количества дополнительных переменных

stdvar = nargin - dopvar; % определение количества фиксированных переменных

fprintf('Number of inputs = %d\n', nargin) % вывод общего количества переменных

fprintf(' Inputs from individual arguments(%d):\n', stdvar) % вывод количества фиксированных переменных

res1=0; % начальное значение суммы фиксированных переменных

res2=0; % начальное значение суммы дополнительных переменных

if nargin>stdvar % если общее количество переменных больше чем фиксированных

for k = 1:length(varargin) % в цикле дополнительные переменные распаковываются

x(k) = varargin{k}(1); % распаковываются в массив х

end

end

res1=A+B % вычисляется сумма фиксированных переменных

res2=sum(x) % вычисляется сумма дополнительных переменных

Обратившись в командном окне к функции, получим результат:

>> vartest(1,2,3,4,5,6,7)

Number of inputs = 7

Inputs from individual arguments(2):

res1 = 3

res2 = 25

Поскольку список varargin хранит входные аргументы в массиве ячеек, то необходимо использовать индексы ячеек для извлечения данных. Индекс ячейки состоит из двух компонентов:

- индекс в фигурных скобках – номер ячейки;

- индекс в круглых скобках – номер элемента в ячейке.

Например, y(i)= varargin{i}(2);

Пример. Функция testvar допускает в качестве входных аргументов любое количество векторов из двух элементов и выводит на экран соединяющие их линии.

function testvar(a,varargin)

for k = 1:length(varargin)

x(k) = varargin{k}(1); % Выбор координат k-го вектора

y(k) = varargin{k}(2); % из k-ой ячейки

end

xmin = min(0,min(x)); ymin = min(0,min(y));

axis([xmin fix(max(x))+3 ymin fix(max(y))+3])

plot(x,y)

Таким образом, функция testvar может работать с входными списками разной длины, например,

testvar([2 3],[1 5],[4 8],[6 5],[4 2],[2 3])

testvar([-1 0],[3 -5],[4 2],[1 1])

Здесь индекс в фигурных скобках {i} указывает доступ к содержанию i-ой ячейки массива varargin, а индекс в круглых скобках (2), указывает на второй элемент массива в ячейке.

При произвольном количестве выходных аргументов их необходимо упаковать в массив ячеек с помощью функции varargout. Чтобы определить количество выходных аргументов функции, используется функция nargout.

Пример.

Следующая функция использует в качестве входа массив из двух столбцов, где первый столбец - множество значений координаты x, а второй – множество значений координаты y. Функция разбивает массив на отдельные векторы-строки, которые могут быть переданы в функцию testvar в качестве входов,

function [varargout] = testvar2(arrayin)

for k = 1:nargout

varargout{k} = arrayin(k,:) % Запись значений в массив ячеек

end

Отметим, что оператор присваивания в цикле for использует синтаксис массивов ячеек. А именно, фигурные скобки указывают, что данные в виде строки массива присваиваются ячейке. Вызвать функцию testvar2 можно следующим образом:

>> a = {1 2;3 4;5 6;7 8;9 0};

>> [p1,p2,p3,p4,p5] = testvar2(a);

Полученный результат будет иметь вид:

p1 = 16

p2 = 2 7

p3 = 3 8

p4 = 4 9

p5 = 5 0

 


Поделиться:

Дата добавления: 2014-12-30; просмотров: 143; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты