- •§ 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.32.2. Форматные преобразования при работе с файлами (fprintf, fscanf).
Даже в том случае, когда строка, записываемая в файл, представляет собой цепочку символов, она обязана подвергнуться преобразованию (форматированию) по следующим причинам:
– в оперативной памяти каждый символ представлен двумя байтами, а в файле – одним;
– для того, чтобы отделить одну строку от другой, вслед за последним символом на диск должна быть записана пара соответствующих управляющих кодов.
На практике символьная информация почти всегда перемежается с числовыми данными, которые могут быть тем или иным способом преобразованы из машинного формата в соответствующие поля строки. Таким конвертированием данных из внутреннего представления в символьное управляют форматные указатели, задаваемые в качестве одного из параметров функции fprintf.
Приведем пример форматной записи в текстовый файл:
>> f_id=fopen('sample.dat','wt'); % Открываем текстовый файл
>> x=fprintf(f_id,'%s\n','qwerty'); % Выводим строку в файл
>> fclose(f_id);
Форматные указатели всегда начинаются с символа %. В представленном примере такой указатель один – '%s', причем он означает, что перед записью на диск требуется преобразовать строку 'qwerty'. Управляющая комбинация '\n', следующая за форматным указателем записывается в файл как признак конца строки. Первый аргумент функции fprintf задает номер открытого файла. Заметим, что в качесте последнего может выступать число -1, и тогда данные передаются в файл стандартного вывода, т.е. в командное окно:
>> fprintf(1,'%s\n','qwerty')
qwerty
Аналогичная картина имеет место и при остутствии первого аргумента:
>> fprintf('%s\n','qwerty')
qwerty
Второй входной аргумент функции fprintf представлен строкой, содержащей форматные указатели и так называемые литеральные константы, к которым относятся все символы, не принадлежащие к форматным указателям. Литеральные константы включаются в выводимую строку без каких-либо преобразований. К литеральным константам в последнем примере относится, в частности, признак конца строки. Количество указателей в строке форматов может может не соответствовать количеству преобразуемых данных. Заметим, что этим MATLAB существенным образом отличается от других систем программирования. Если длина списка формальных указателей меньше, чем количество преобразуемых данных, то список циклически повторяется. Так, например, имеем:
>> fprintf('%5d',1,2,3,4)
1 2 3 4
Форматный указатель '%5d' в данном случае повторился четыре раза. Если количество указателей формата превышает длину выводимого списка, то лишние форматные указатели игнорируются:
>> fprintf('%d %f %e',4,7)
4 7.000000
Данные, подлежащие преобразованию перед записью в файл, задаются
третьим и последующими аргументами входными аргументами функции fprintf. Так, например, если требуется записать в очередную строку текстового файла два целых и одно вещественное значения переменных x, y и z, то это можно реализовать следующим образом:
>> x=123;
>> y=2015;
>> z=2.34567;
>> fprintf('%5d %d %8.3f\n',x,y,z);
123 2015 2.346
Значение переменной x преобразуется в формат целого числа (свидетельством этому является буква d в первом форматном указателе) и для его записи в выводной строке отводится 5 позиций. Между первым и вторым форматными указателями располагается один пробел, который считается литерной константой, разделяющей первое и второе числа. Значение переменной y преобразуется по формату %d и занимает в выводной строке 4 позиции. После второго числа вставляется еще один литеральный пробел, расположенный между вторым и третьим указателями формата. Следующие 8 позиций отведены для результата преобразования вещественного числа (свидетельством этому является буква f в третьем форматном указателе), у которого сохраняются три значащие цифры в дробной части (результат форматного преобразования при этом округляется в соответствии с общепринятыми математическими правилами).
В целом, следует отметить, что форматные указатели, используемые в функции fprintf, были привнесены в MATLAB после определенной модификации из языка программирования C++. Одной из важнейших модификаций в этом смысле является возможность использования матрицы в качестве элемента выводного списка (в этом случае список форматных указателей определяет преобразование каждого элемента очередного столбца матрицы).
В общем случае указатель формата начинается с символа '%', после которого могут быть расположены три необязательные компоненты – флажки, ширина (w) и точность (.n). Указатель завершается при этом одним из символов, характеризующих тип преобразования данных и представленных в таблице 2.32.3. Следует отметить, что использование целочисленных форматов (%d, %i, %u, %x, %X, %o) предполагает, что преобразуемое значение в самом деле является целым. При использовании целочисленных форматов для преобразования вещественного значения, перед выводом в файл такие величины необходимо округлить с помощью соответствующих функций (fix, round, floor или ceil).
Таблица 2.32.3. Символы, характеризующие тип преобразования данных.
Символ формата |
Формат результата |
d |
Преобразование целочисленного значения в десятичное число со знаком |
i |
Преобразование целочисленного значения в десятичное число со знаком |
o |
Преобразование целочисленного значения в восьмеричное число со знаком |
u |
Преобразование целочисленного значения в десятичное число без знака |
x |
Преобразование целочисленного значения в шестнадцатеричное число без знака с использованием строчных букв a, b, c, ..., f в качестве цифр |
X |
Преобразование целочисленного значения в шестнадцатеричное число без знака с использованием заглавных букв A, B, C, ..., F в качестве цифр |
f |
Преобразование числового значения в вещественное число с фиксированной точкой |
е |
Преобразование числового значения в вещественное число с плавающей точкой (признак порядка – буква е) |
E |
Преобразование числового значения в вещественное число с плавающей точкой (признак порядка – буква E) |
g |
Преобразование числового значения в вещественное число с фиксированной или плавающей плавающей точкой в зависимости от того, какой формат числа занимает меньше места (незначащие нули в дробной части не выводятся) |
G |
Преобразование числового значения в вещественное число с фиксированной или плавающей плавающей точкой в зависимости от того, какой формат числа занимает меньше места (незначащие нули в дробной части не выводятся) |
s |
Преобразование текстового значения в строку символов. |
c |
Преобразование единственного символа |
В качестве флажков, следующих непосредственно после символа '%', могут использоваться следующие символы:
– знак '-' – для вывода очередного символьного или числового значения, начиная с левой границы текущего поля (левый прижим; по умолчанию выводимое значение приближается к правой границе текущего поля);
– символ '+' – для обязательного включения знака числа (традиционно знак «плюс» у положительных чисел опускается);
– символ 'пробел' – для вывода пробела вместо знака положительного числа (традиционно такой пробел игнорируется);
– символ '#' – для формирования префиксов у восьмеричных и шестнадцатеричных чисел.
Ширина w, задаваемая целым числом, определяет количество позиций в текущем поле строки, в которых должна разместиться преобразуемая величина. Ширине может предшествовать цифра 0, и в таком случае старшие незначащие позиции чисел заполняются не пробелами, а нулями.
Точность n, следующая за шириной и отделяемая от нее точкой, как правило, определяет количество значащих цифр у вещественного числа в дробной части. Тем не менее, согласно правилам языка программирования C++ точность может быть использована и в сочетании с соответствующими форматными преобразованиями целых чисел (в этом случае преобразуемое число должно содержать в своей символьной записи не менее, чем n цифр, причем если их меньше, то старшие позиции числа дополняются недостающим количеством нулей (так, при преобразовании строки по формату '10.5s' в файл попадут не более 5 первых символов, прижатых к правой границе поля, содержащего 10 позиций) и даже строк.
Среди литеральных констант в командной строке кроме уже упомянутого ранее признака конца строки ('\n') могут использоваться и другие управляющие символы, называемые в литературе Esc-последовательности. Перечень последних представлен в таблице 2.32.4.
Таблица 2.32.4. Esc-последовательности.
Символ |
Описание |
\b |
Удаление предшествующего символа (Backspace) |
\f |
Перевод страницы (Form feed) |
\n |
Перевод строки (New line) |
\r |
Возврат каретки (Carriage return) |
\t |
Горизонтальная табуляция (Horizontal tab) |
Заметим, что некоторые символы командной строки задействованы как управляющие:
– с символа % начинается форматный указатель;
– одиночная кавычка ' открывает и закрывает строку форматов;
– обратная косая черта \ использована в Esc-последовательностях.
Для включения таких символов в состав литеральных констант и демонстрации их явного отличия (во избежание путаницы) от управляющих комбинаций, в форматной строке действуют следующие соглашения:
– %% – воспринимается как символ процента;
– \\ – воспринимается как обратная косая черта;
– '' – воспринимается как одиночная кавычка;
– \” – воспринимается как двойная кавычка.
Заметим, что в случае, если в текстовый файл с помощью функции fprintf записывается единственная строка, строка форматных указателей может быть опущена.
Выборка данных из текстового файла может быть произведена с помощью функции fscanf, обращение к которой в общем случае имеет вид:
[a n]=fscanf(f_id,'format',m);
где a – принимающий массив, в элементы которого заносятся считываемые данные; n – количество фактически считанных значений; f_id – номер открытого файла; format – список форматных указателей, в соответствии с которым осуществляется преобразование считываемых данных; m – количество запрашиваемых данных.
Заметим, что обязательными параметрами в представленном обращении являются массив a, идентификатор f_id и хотя бы один форматный указатель в списке format. Отсутствие количества запрашиваемых значений или константа Inf в качестве третьего параметра воспринимаются как задание прочитать данные до конца файла. Если количество запрашиваемых значений задано числом m, то считываемые данные размещаются в векторе-столбце размерности mх1. Тем не менее, задав количество запрашиваемых данных в виде вектора размерности [p q], можно прочитать данные из файла в матрицу размерности pхq.
Форматные указатели, задаваемые в строке формата у функции fscanf, почти совпадают с соответствующими форматными указателями у функции fprintf (см. таблицу 2.32.3). Отметим, что если на этапе вывода точность имеет определенный смысл, то на стадии ввода она, по сути, не играет роли. При считывании вещественных данных из текстового файла указатели типа %f, %e и %g выполняют одинаковые функции, преобразуя считанное значение в формат типа double. Форматные указатели типа %d и %i выбирают из очередного поля текстового файла целочисленные данные, однако в элементы принимающего массива результат заносится в формате double.
Если форматный указатель начинается с комбинации '%*', то соответствующее значение, считанное из файла, в принимающий массив не передается (это правило дает возможность пропускать ненужные данные).
Форматные указатели типа '%s' на выводе и на вводе действуют по-разному. Строка данных, записываемая в файл, может содержать, например, пробелы. Однако при чтении единичного элемента по формату '%s', это чтение прерывается на первом же пробеле. При запросе чтения более чем одного элемента, соответствующие «белые пробелы», встречающиеся в текстовой строке, игнорируются.
