- •Раздел 1 Основные понятия среды matlab
- •1. Начало работы в среде matlab
- •1.1. Характеристика среды matlab
- •1.2. Общие положения и правила работы в среде matlab
- •1.3. Работа в командном окне
- •1.4. Правила и особенности ввода математических выражений
- •1.5. Сохранение содержимого рабочего окна
- •2 Системные переменные и типы данных
- •2.1 Системные переменные
- •2.2. Типы данных. Описание основных типов
- •2.3. Комплексные числа
- •2.4. Символьные переменные
- •2.5. Массивы
- •2.5.1 Задание массивов
- •2.5.2 Доступ к элементам массивов
- •2.5.3 Функции обработки массивов
- •2.6 Тип данных структура (struct)
- •2.6.1 Задание структур
- •2.6.2 Функции обработки структур
- •2.7 Тип данных ячейка (сell)
- •2.8 Функции определения типов
- •2.9 Функции для работы со значениями даты и времени
- •2.10 Функции преобразования типов
- •3. Основные операции и математические функции matlab
- •3.1 Основные арифметические операции
- •3.2 Основные элементарные функции
- •Help имя_функции,
- •3.3 Операции отношения и логические операции
- •4 Операторы среды matlab
- •4.1 Условный оператор if
- •4.2 Условный оператор switch
- •4.3 Реализация циклических процессов
- •4.3.1 Оператор цикла while
- •4.3.2 Оператор цикла for
- •Pause – останавливает выполнение программы до момента нажатия любой клавиши на клавиатуре; pause(n) – останавливает выполнение программы на n секунд;
- •Примеры.
- •Как и в случае сценариев, к подпрограмме функции можно обратиться по имени, более того функции могут быть компонентами математических выражений и операндов, а также параметрами других функций.
- •5.4 Создание подпрограмм с переменным списком входных и выходных параметров
- •5.5 Локальные и глобальные переменные
- •5.6 Созданий функций пользователя и указателей на функции. Функции как аргументы функций.
- •5.8 Сообщения об ошибках
- •6 Ввод данных и работа с файлами
- •6.1 Использование рабочей области Workspace
- •6.2 Чтение и запись неформатированных файлов
- •6. 3 Работа с текстовыми и бинарными файлами
- •6.3.1 Команды открытия и закрытия файлов
- •6.3.2 Команды чтения и записи fread и fwrite
- •6.4 Операции над форматированными файлами
5.4 Создание подпрограмм с переменным списком входных и выходных параметров
При создании функций со специальными свойствами весьма полезны две приведенные ниже функции:
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
