- •§ 2.2. Командное окно системы matlab
- •§ 2.3. Рабочее пространство системы matlab
- •§ 2.4. Скаляры и массивы. Индексированные переменные
- •§ 2.5. Форматы представления вещественных чисел
- •§ 2.6. Арифметические выражения
- •2.6.1. Некоторая специфика использования вещественных данных
- •2.6.2. Некоторая специфика использования комплексных данных
- •2.6.3. Некоторые приемы работы с матрицами и векторами
- •2.6.4. Некоторые специфика выполнения арифметических и логических операций.
- •§ 2.7. Элементарные математические функции
- •Часть 2. Визуализация результатов вычислений
- •§ 2.8. Особенности графической подсистемы matlab
- •§ 2.9. Построение графиков функций одной переменной
- •2.9.1. Простые графики в декартовой системе координат.
- •2.9.2. Визуализация нескольких графиков.
- •2.9.3. Функция fplot.
- •2.9.4. Построение графиков в логарифмическом и полулогарифмическом масштабах.
- •2.9.5. Построение графиков в полярных координатах.
- •§ 2.10. Оформление графиков и графических окон
- •2.10.1. Выбор свойств линий.
- •2.10.2. Оформление осей координат.
- •2.10.3. Добавление надписей, заголовков и координатной сетки.
- •§ 2.11. Средства управления в графическом окне
- •§ 2.12. Общее знакомство с трехмерной графикой в matlab
- •2.12.1. Общий алгоритм визуализации функций двух переменных.
- •2.12.2. Построение трехмерных линий.
- •2.12.3. Построение поверхностей.
- •2.12.4. Задание дополнительных параметров трехмерных графиков.
- •2.12.5. Построение линий уровня.
- •2.12.6. Построение траектории точки, движущейся в пространстве.
- •2.12.7. Интерактивное редактирование графиков.
- •Часть 3. Вычисления с действительными и комплексными массивами чисел
- •§ 2.13. Операции отношения и логические операции над числами
- •2.13.1. Операции отношения.
- •2.13.2. Логические операции.
- •2.13.3. Приоритет операций.
- •§ 2.14. Формирование одномерных числовых массивов
- •2.14.1. Задание одномерных массивов и доступ к их элементам.
- •2.14.2. Об ускорении операций задания массива.
- •2.14.3. Об использовании операции формирования диапазона.
- •§ 2.15. Матрицы и векторы. Двумерные массивы чисел
- •2.15.1. Создание матриц и векторов.
- •2.15.2. Доступ к отдельным фрагментам матриц.
- •2.15.3. Удаление строк и столбцов матрицы.
- •2.15.4. Использование функций перестановки частей матриц.
- •2.15.5. Определение размеров и размерностей массивов.
- •2.15.6. Использование операций индексации.
- •2.15.7. Изменение размеров массива.
- •2.15.8. Специальные функции формирования массивов.
- •§ 2.16. Вычисления с массивами
- •2.16.1. Поэлементные и групповые операции над массивами.
- •2.16.2. Решение некоторых типовых задач линейной алгебры и аналитической геометрии.
- •2.16.3. Применение операций отношения и логических операций к массивам.
- •2.16.4. Некоторые функции для работы с массивами.
- •Часть 4. Стандартные средства решения некоторых типовых задач линейной алгебры и математического анализа
- •§ 2.17. Решение систем линейных алгебраических уравнений
- •§ 2.18. Решение некоторых задач линейной алгебры. Матричные функции
- •§ 2.19. Разреженные матрицы
- •§ 2.20. Решение нелинейных уравнений
- •§ 2.21. Поиск минимального значения функции
- •§ 2.22. Численное интегрирование
- •2.22.1. Использование метода трапеций.
- •2.22.2. Использование методов Симпсона и Гаусса-Лобатто.
- •2.22.3. Вычисление двойных интегралов.
- •§ 2.23. Операции над полиномами
- •2.23.1. Вычисление значения полинома.
- •2.23.2. Вычисление корней полинома.
- •2.23.3. Умножение и деление полиномов.
- •2.23.4. Дифференцирование и интегрирование полиномов.
- •§ 2.24. Интерполяция и аппроксимация данных
- •2.24.1. Полиномиальная аппроксимация.
- •2.24.2. Интерполяция сплайнами.
- •Часть 5. Символьные вычисления
- •§ 2.25. Создание символьных переменных, выражений и матриц
- •2.25.1. Создание символьных переменных.
- •2.25.2. Создание символьных выражений.
- •2.25.3. Создание символьных матриц.
- •§ 2.26. Символьные вычисления
- •2.26.1. Символьное дифференцирование.
- •2.26.2. Вычисление пределов.
- •2.26.3. Символьное интегрирование.
- •2.26.3. Вычисление суммы ряда. Разложение функций в ряды.
- •2.26.4. Упрощение выражений. Подстановки.
- •2.26.5. Управление точностью вычислений.
- •2.26.6. Операции над векторами. Операции над матрицами. Некоторые операции линейной алгебры.
- •2.26.7. Решение уравнений и систем уравнений.
- •§ 2.27. Визуализация результатов символьных вычислений
- •2.27.1. Построение двумерных графиков.
- •2.27.2. Построение трехмерных графиков.
- •Часть 6. Основы программирования на m-языке
- •§ 2.28. Основные понятия программирования в системе matlab
- •2.28.1. Назначение языка программирования matlab.
- •2.28.2. Основные средства программирования.
- •2.28.3. Основные типы данных.
- •2.28.4. Виды программирования.
- •2.28.5. Двойственность операторов, команд и функций.
- •2.28.6. Некоторые ограничения.
- •§ 2.29. Создание и использование m-файлов
- •2.29.1. Понятие об m-файлах.
- •2.29.2. Типы m-файлов.
- •2.29.3. Создание файл-программ.
- •2.29.4. Создание файл-функций.
- •2.29.5. Глобализация переменных и функций.
- •2.29.6. Синтаксический контроль программ.
- •§ 2.30. Управляющие структуры
- •2.30.1. Понятие об управляющих структурах.
- •2.30.2. Операторы цикла.
- •2.30.3. Операторы ветвления.
- •2.30.4. Прочие операторы.
- •§ 2.31. Работа с файлами
- •2.31.1. Общие замечания.
- •2.31.2. Подготовка файла к работе.
- •2.31.3. Завершение работы с файлами.
- •2.31.4. Контроль за исчерпанием данных.
- •2.31.5. Чтение из текстового файла.
- •2.31.6. Анализ ошибок в файловых операциях.
- •§ 2.32. Форматный ввод-вывод данных
- •2.32.1. Форматные преобразования (sprintf, sscanf).
- •2.32.2. Форматные преобразования при работе с файлами (fprintf, fscanf).
- •§ 2.33. Рекурсивные файл-функции. Производительность файл-функций
- •2.33.1. Понятие о рекурсивных файл-функциях.
- •2.33.2. Оценка производительности файл-функции.
- •§ 2.34. Файл-функции с переменным числом входных параметров и выходных значений
- •§ 2.35. Диалоговые программы
- •2.35.1. Ввод числовых и символьных данных.
- •2.35.2. Вывод результатов вычислений.
- •§ 2.36. Анимационные эффекты
- •§ 2.37. Контроль входных и выходных параметров файл-функции
- •§ 2.38. Отладка программы
- •2.38.1. Понятие о способах отладки программы.
- •2.38.2. Рекомендации по созданию и отладке программ.
- •Часть 7. Создание программ с визуальным интерфейсом
- •§ 2.39. Понятие о графическом интерфейсе пользователя (gui)
- •2.39.1. Предварительные замечания.
- •2.39.2. Основные команды для создания gui.
- •§ 2.40. Общие сведения о визуальной среде guide
- •§ 2.41. Программирование событий в matlab
- •§ 2.42. Свойства основных компонентов в matlab
- •§ 2.43. Диалоговые окна в matlab
- •§ 2.44. Динамическое создание компонентов
- •§ 2.45. Создание меню
- •§ 2.46. Некоторые рекомендации по созданию приложений с графическим интерфейсом пользователя
§ 2.33. Рекурсивные файл-функции. Производительность файл-функций
2.33.1. Понятие о рекурсивных файл-функциях.
Рассмотрим решение классической задачи о вычислении факториала целого положительного числа, основанное на применении рекурсивной файл-функции. Поясним, что функция называется рекурсивной, если в процессе вычислений она осуществляет вызов самой себя. Ниже приведен формальный пример такой ситуации:
function res=Fact_Rec(n)
res=1;
for i=2:n
res=Fact_Rec(i-1).*i;
end
Так как в теле функции Fact_Rec осуществляется вызов этой же функции (но с другим аргументом), то данная функция по определению является рекурсивной. В общем случае создавать рекурсивные функции отнюдь не сложнее нерекурсивных, однако при этом следует самым внимательным образом контролировать последовательность вложенных вызовов таких функций для установления факта завершения соответствующего процесса. Здесь потенциально велик риск ошибок, связанных с зацикливанием рекурсивных вызовов (в таких случаях окончательного выхода из соответствующей функции не происходит вовсе). В целях недопущения «зависания» компьютера в подобных ситуациях в системе MATLAB (в отличие, например, от языка программирования C) все файл-функции выполняются под полным контролем самой системы, которая ограничивает предельное количество рекурсивных вызовов. С одной стороны, это положительное свойство, но с другой – это существенное вторжение в процесс выполнения рекурсивных файл-функций, ограничивающее их самостоятельную роль.
Заметим, впрочем, что роль рекурсивных файл-функций в MATLAB значительно ниже, чем, например, в системах программирования на языках С/С++, так как наиболее интересные случаи их применения базируются на использовании указателей, которые в M-языке отсутствуют.
2.33.2. Оценка производительности файл-функции.
Очевидно, что алгоритмы решения одной и той же задачи могут отличаться друг от друга по различным критериям и, прежде всего, по времени вычислений. Система MATLAB предоставляет пользователю удобные и эффективные средства для приблизительного замера данной характеристики – команды tic и toc:
>> tic,Fact_Rec(10),toc
ans =
3628800
Elapsed time is 0.006692 seconds.
Следует отметить, что время выполнения замеряется приблизительно и зависит от целого ряда неконтролируемых факторов, поэтому соответствующие вызовы целесообразно повторять несколько раз, выполняя последующее осреднение полученных результатов замеров.
§ 2.34. Файл-функции с переменным числом входных параметров и выходных значений
В рассмотренных ранее файл-функциях использовалось строго фиксированное конечное число входных параметров и выходных значений, однако на практике нередко возникают ситуации, когда полезно иметь одну функцию, которая в штатном режиме работы может обрабатывать переменное число входных параметров и выходных значений. В M-языке такая возможность основывается на использовании массива ячеек. В определении файл-функции параметр, через который передается заранее неизвестное число входных аргументов, обозначается ключевым словом varargin. Таким ключевым словом обозначается массив ячеек, в который упакованы данные параметры. Заметим, что функция всегда может узнать истинное число аргументов, упакованных в параметре varargin, применив для этой цели функцию length.
В качестве примера ниже представлена файл-функция вычисляющая сумму длин произвольного числа двумерных векторов:
function SumLenVec=NumLength(varargin)
n=length(varargin);
SumLenVec=0.;
for k=1:n
SumLenVec=SumLenVec+varargin{k}(1)^2+varargin{k}(2)^2;
end
Если аргумент varargin не единственный в списке параметров, то он должен стоять последним. В рассмотренном примере с помощью фигурных скобок извлекается содержимое отдельной ячейки, т.е. вектор, а с помощью дальнейшей индексации с использованием круглых скобок извлекаются первая и вторая компоненты (координаты) вектора.
При вызове файл-функции NumLength не требуется (и, более того, запрещается) упаковывать входные числовые вектор-строки в массив ячеек в силу того, что система MATLAB выполняет этот процесс самостоятельно. Достаточно лишь перечислить эти данные в качестве фактических параметров через запятую:
>> NumLength([1 2], [3 4], [5 6])
ans =
91
>> NumLength([1 2], [3 4])
ans =
30
>> NumLength([1 2], [3 4], [5 6], [7 8])
ans =
204
Представленные примеры свидетельствуют о том, что файл-функция успешно обрабатывает все три случая, корректно вычисляя суммарную длину входных векторов.
В определении файл-функции переменное число возвращаемых значений упаковывается в массив ячеек, обозначаемый ключевым словом varargout, например:
function varargout=My_Function(X)
В данном случае в массив ячеек с именем varargout можно в теле функции упаковать произвольное число выходных значений. Предположим, что на вход функции My_Function может подаваться в качестве единственного входного параметра массив разных размерностей и размеров, а возвращать требуется несколько скаляров, каждый из которых является размером входного массива вдоль одного из его измерений. Ввиду того, что количество измерений заранее неизвестно, его можно определить в теле функции динамически и на ходу упаковать все указанные скаляры в единственную выходную переменную varargout:
function varargout=My_Function(X)
n=ndims(X);
for k=1:n
varargout(k)={size(X,k)};
end
Функция size(X,k) в приведенном примере вычисляет размер массива X вдоль k-го направления (измерения). Ниже приведен простейший пример использования файл-функции My_Function:
>> A=[1 2 3; 4 5 6]
A =
1 2 3
4 5 6
>> [m,n]=My_Function(A)
m =
2
n =
3
Если интерес представляет лишь размер данного массива вдоль первого измерения, следует вызвать функцию My_Function в формате вида
>> [m]=My_Function(A)
m =
2
который, необходимо отметить, является корректным с точки зрения синтаксиса M-языка (при этом второе возвращаемое функцией My_Function значение теряется).
