Глава 3. Элементы программирования
1+mod(i,2),'Color',colors(mod(i,3)+1)). Здесь дважды использована функция mod(), у которой два аргумента, а в качестве результата возвращается остаток от деления первого аргумента на второй. Поэтому результатом инструкции 1+mod(i,2) является значение 1 для четных значений переменной i и 2 для нечетных. В результате графики по очереди отображаются тонкой и толстой кривыми. Значением выражения mod(i,3)+1 являются числа 1, 2 и 3, поэтому инструкцией colors(mod(i,3)+1) осуществляется циклический перебор элементов массива colors. Наконец, после создания всех графиков инструкцией hold off отменяется режим отображения графиков в одном окне. На рис. 3.36 показано окно редактора m-файлов с кодом рассмотренной выше функции.
Рис. 3.36. Код функции с переменным числом аргументов в окне редактора m-файлов
Пример вызова созданной функции представлен в командном окне на рис. 3.37.
Сначала создается базовый массив со значениями аргумента, а затем еще четыре массива со значениями различных функций в этих точках. Следующие три команды представляют собой вызов функции с одним, пятью и тремя аргументами (жирным шрифтом выделены команды, вводимые пользователем):
>>x=-2*pi:0.01:2*pi;
>>y1=sin(x);
>>y2=cos(x);
>>y3=sin(x)./x;
141
Самоучитель Matlab
Рис. 3.37. Вызов функции с разным количеством аргументов в командном окне
>>y4=(1-cos(x))./x;
>>MyPlots(x)
Недостаточное количество аргументов!
>>MyPlots(x,y1,y2,y3,y4)
>>MyPlots(x,y1,y2)
При вызове функции с одним аргументом появляется сообщение о недостаточном количестве аргументов. Результат вызова функции с пятью аргументами показан на рис. 3.38.
Рис. 3.38. Результат вызова функции с пятью аргументами
142
Глава 3. Элементы программирования
Если вызвать функцию с тремя аргументами, получим результат, как на рис. 3.39.
Рис. 3.39. Результат вызова функции с тремя аргументами
На заметку
Отметим, что если вызвать функцию MyPlots() с двумя аргументами, будет построен лишь один график, поскольку в теле оператора цикла нижняя граница диапазона изменения индексной переменной превышает верхнюю, и поэтому оператор цикла не выполняется.
Точно так же, как функция может иметь произвольное количество аргументов, она может возвращать и произвольное количество значений в качестве результата. В этом случае в качестве результата функции указывается переменная varargout. Как и переменная varargin, переменная varargout является массивом ячеек, каждая из которых содержит возвращаемый функцией результат. Ниже приведен пример функции, которая называется moments() и может возвращать произвольное количество значений в качестве результата:
function [varargout] = moments(x) for k=1:nargout
y=x.^k;
varargout{k}=sum(y)/length(x); end
end
143
Самоучитель Matlab
Предполагается, что функции аргументом передается массив числовых значений. В качестве значений функцией возвращаются статистические (или выборочные) моменты. Здесь имеет смысл отметить, что статистическим
(выборочным) моментом порядка k по выборке (множеству значений) x1 , |
||||
|
|
1 |
n |
|
x2 ,...,xn называется число mk |
= |
∑xik . Таким образом, момент первого |
||
|
||||
|
n |
i=1 |
||
|
|
|
||
порядка представляет собой среднее арифметическое. В данном случае количество вычисляемых моментов определяется тем, сколько переменных содержит массив результата. На рис. 3.40 показан редактор m-файлов с кодом функции.
Рис. 3.40. Программный код функции в окне редактора m-файлов
На рис. 3.41 показано командное окно с примером использования функции moments().
Рис. 3.41. Пример использования функции moments()
144
Глава 3. Элементы программирования
Здесь с помощью команд (жирным шрифтом выделен ввод пользователя)
>>x=[1,2,5,-3,-2,0,2,1,-1,3];
>>[m1,m2,m3]=moments(x)
m1 =
0.8000
m2 =
5.8000
m3 =
13.4000
сначала создается числовой массив x, а затем на его основе вычисляются моменты от первого до третьего порядка включительно. Результат записывается соответственно в переменные m1, m2 и m3.
Функции eval () и feval ()
Софистика, пастор, софистика!
К/ф "Семнадцать мгновений весны"
Полезными при составлении программных кодов в Matlab могут оказаться системные функции eval() и feval(). У функций есть несколько вариантов использования. Здесь рассмотрим самый распространенный. Начнем с функции eval(). Функции передается текстовый аргумент, представляющий собой команду, которую необходимо выполнить. Обратимся к документу на рис. 3.42.
Рис. 3.42. Использование функции eval()
Фрагмент кода следующий:
>> eval('x=[1,2,3,4,5]') x =
1 |
2 |
3 |
4 |
5 |
145