КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Создание подпрограмм с переменным списком входных и выходных параметровПри создании функций со специальными свойствами весьма полезны две приведенные ниже функции: · 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
|