Слайд 1Структуры данных. Анимация. Файлы.
Прикладные программные системы
Лекция №4
Слайд 3Ячеечные массивы (I)
Ячеечный массив (cell array) — это массив, каждый
элемент которого может содержать любой тип данных: вектор, строку, матрицу,
другой массив и т.д.
Создать массив ячеек можно функцией cell:
>> a = cell(5, 7); % это массив 5x7 ячеек
Можно создавать и вручную:
>> b = {'Concordia', [1 3 5]; {2, [5 1]}, 'a'};
Обращение к элементам массива:
>> c = b{2, 1};
c =
{2, [5 1]}
>> d = b{1, :};
d =
{'Concordia', [1 3 5]}
Слайд 4Ячеечные массивы (II)
Для наглядного отображения массива ячеек используется функция cellplot:
>>
C = {rand(3, 2) zeros(5, 5); 'This is the string'
[1 3 5 7]};
>> cellplot(C);
Слайд 5Функции для работы с ЯМ
Преобразование из ЯМ в матрицу осуществляется
функцией cell2mat:
>> B = cell2mat(C);
ячеечный массив C должен содержать однотипные
данные!
Вывод содержимого ЯМ в командное окно (функция celldisp):
>> celldisp(C);
Примененить некоторую функцию к каждой из ячеек массива можно функцией cellfun:
>> A = cellfun(f, C); % здесь f — ссылка на функцию
Матрица, в свою очередь, преобразуется в ЯМ функцией mat2cell:
>> x = rand(10, 20);
>> C = mat2cell(x, [5 5], [13 7]);
получится ячеечный массив, содержащий «куски» матрицы
Слайд 6Структуры
Структура — тип данных, состоящий из именованных полей, содержащих произвольные
данные.
Структура создаётся функцией struct.
Пустую структуру можно создать так:
>> s =
struct();
Поля структуры можно создавать «на лету».
Поля создаются с помощью точки и указания имени поля.
Пример:
>> s.name = 'Erwin Schrodinger';
>> s.birthday = '12.08.1887';
>> s.has_nobel = true;
Слайд 7Структурные массивы (I)
Интуитивно структурный массив можо представить в виде таблицы;
полями будут являться заголовки этой таблицы, содержимое колонок же будет
содержимым массива.
Каждое поле содержит данные своего типа.
Структурные массивы создаются той же функцией struct.
Пример со структурным массивом с известными физиками:
>> physicists = struct('name', {'Albert Einstein', 'Erwin Schrodinger', 'Werner Heisenberg', 'Paul Dirac'}, 'birthday', {'14.03.1879', '12.08.1887', '05.12.1901', '08.08.1902'}, 'has_nobel', {true, true, true, true});
Здесь имена полей задаются строковыми параметрами, содержимое — ячеечными массивами.
Слайд 8Структурные массивы (II)
Обращение к определённому полю:
>> ph1 = physicists(3).name; %
в скобках указывается номер строки в «воображаемой таблице», а через
точку — название поля
Обращение к целой строке «воображаемой таблицы»:
>> ph2 = physicists(1)
ph2 =
name: 'Albert Einstein'
birthday: '14.03.1879'
has_nobel: true
Обращение к содержимому столбца (поля):
>> ph3 = physicists.name;
Слайд 9Хэндлы (handles)
«А хотите я его стукну, и он станет фиолетовым?
В крапинку».
из м/ф «Тайна третьей планеты»
Слайд 10Handles
Handle (хэндл; манипулятор) — это переменная, которая содержит ссылку на
свойства некоторого объекта.
Будем рассматривать их применительно к графике.
Handle позволяет изменить
свойства графического объекта без его перерисовки (т.е. без вызова функции типа plot).
Получить handle графика очень просто:
>> x = 0:0.01:2*pi;
>> h = plot(x, sin(x)); % здесь переменная h — это handle построенной линии
Handle осей текущего графика (gca):
>> xy = gca; % здесь gca — это функция, выдающая handle «коробочки», в которой строится график
Аналогично для всего графического окна (gcf):
>> f = gcf;
Слайд 11Операции с хэндлами
Все поля структуры, на которую ссылается хэндл, можно
получить функцией get:
>> get(h) % h — имя хэндла, а
в командное окно выведутся наименования полей и их содержимое
>> b = get(h, 'ParameterName'); % запишет в b значение параметра с именем 'ParameterName'
Задать новое значение какому-либо полю структуры можно функцией set:
>> set(h, 'Color', [0 1 0]); % задаёт красный цвет линии на графике
Общий синтаксис функции:
set(handle, 'Parameter', value)
С помощью этих операций менять параметры объекта, не строя объект заново.
Слайд 12Анимация
— Кристобаль Хозевич, я ее всё-таки решил. Вы были совершенно
правы. Пространство заклинаний действительно можно свернуть по любым четырем переменным.
А.
и Б. Стругацкие, «Понедельник начинается в субботу»
Слайд 13Анимация и хэндлы
Получив хэндл графика, вы можете оперировать его параметрами:
>>
h = plot(x, y);
Например, у графика есть параметры 'XData' и
'YData', содержащие векторы с x-координатами и y-координатами графика соответственно.
Меняя эти параметры, можно менять сам график, не затрагивая его окружение.
Если менять эти параметры в цикле, можно добиться чего-то подобного смене кадров в анимационном фильме.
Полезной будет и функция pause, которая останавливает выполнение кода на заданное количество секунд:
>> pause(0.1);
Функция drawnow, напротив, требует перерисовать график сейчас же.
Слайд 14Пример анимации (I)
x = 0;
y = sin(x);
h = plot(x, y,
'LineWidth', 4);
xlim([0 2*pi]);
ylim([-1 1]);
grid on;
for k = 0.01:0.01:2*pi
x = [x
k];
y = [y sin(k)];
set(h, 'XData', x, 'YData', y);
pause(0.01);
end;
Слайд 15Пример анимации (II)
x = rand(1, 100) - 0.5;
y = rand(1,
100) - 0.5;
vx = (rand(1, 100) - 0.5) * 0.1;
vy
= (rand(1, 100) - 0.5) * 0.1;
h = plot(x, y, '.', 'MarkerSize', 6);
xlim([-5 5]);
ylim([-5 5]);
frames_count = 150;
for k = 1:frames_count
x = x + vx;
y = y + vy;
set(h, 'XData', x, 'YData', y);
pause(0.1);
end;
Слайд 16Файлы с анимацией (I). Особенности матрицы
Для создания анимационных файлов потребуется
четырёхмерная матрица размерности
где M — количество строк;
N — количество столбцов;
P — количество слоёв (1 или 3);
R — число кадров.
Например, такая:
>> img = round(rand(200, 200, 1, 20) * 255);
Тогда, например, матрица, соответствующая пятому кадру, это img(:, :, 1, 5)
Такую матрицу можно записать в анимированный GIF-файл:
>> imwrite(img, 'filename.gif');
Слайд 17Файлы с анимацией (II). Параметры GIF
У функции imwrite есть дополнительные
параметры.
Некоторые из них относятся к анимационным gif-файлам
Эти параметры указываются таким
же образом, как, например, у функции plot — имя параметра в кавычках, через запятую значение параметра.
Слайд 18Файлы с анимацией (III). Структура с кадром
Можно считать в кадр
содержимое некоторого текущего графического окна:
>> F = getframe(h); % здесь
h — handle графического окна
Если кадр снимается с текущего окна, можно не указывать ничего:
>> F = getframe;
Функция getframe возвращает структуру с двумя полями: cdata и colormap
F.cdata содержит матрицу кадра
F.colormap содержит цветовую карту кадра
Слайд 19Файлы с анимацией (IV). Массив кадров
Если записывать кадры в структурный
массив в цикле, то получим последовательность кадров:
>> for k =
1:30
imagesc(rand(300, 300, 3));
fs(k) = getframe;
end;
такой структурный массив можно запустить на проигрывание:
>> movie(fs);
функция movie имеет ещё два параметра: число проигрываний и количество кадров в секунду:
>> movie(fs, 5, 30); % 5 раз проиграть ролик со скоростью 30 кадров в секунду
Слайд 20Файлы с анимацией (V). Создание видеофайлов
Созданный структурный массив можно записать
в видеофайл:
>> movie2avi(fs, 'your_file.avi');
у функции movie2avi есть дополнительные параметры
основной параметр
— это кодек, которым вы кодируете видео
под Windows 7 есть проблема [!]: ни один из стандартных кодеков не работает
можно попробовать перебрать следующие варианты: 'X264', 'FFDS', 'IYUV', 'WMV3'
>> movie2avi(fs, 'file.avi', 'Compression', 'FFDS');
параметр 'Compression' отвечает за кодек
Слайд 21Функция comet
Когда строится траектория движения, иногда не понятно, где начало,
а где окончание
Эту проблему призвана решить функция comet:
>> t =
0:0.0005:4;
>> x = 3 * cosd(45) * t;
>> y = 5 + 3 * sind(45) * t - 9.81 * t.^2 / 2;
>> comet(x(y>0), y(y>0));
Она строит график так же, как на слайде №14 "Пример анимации (I)"
Слайд 22Работа с файлами с данными
— Компьютер, сделай что-нибудь!
— Без проблем.
Включаю ручное управление. Удачи!
к/ф "Автостопом по Галактике"
Слайд 23Общие сведения
MatLab содержит функции для чтения и записи самых различных
типов файлов
Познакомимся с несколькими основными функциями для чтения и записи:
файлов
данных MatLab
табличных данных
текстовых файлов
Файл с данными в формате MatLab имеет расширение mat
Основные табличные форматы:
csv (comma separated values)
xls, xlsx (Excel-таблицы)
Текстовые файлы обычно имеют расширение txt, но могут быть любыми
Слайд 24Файлы данных MatLab
Любую переменную или их множество можно записать в
mat-файл.
Это делается функцией save:
>> save 'my_data'; % сохранит все данные
из Workspace в файл my_data.mat
>> save 'my_data' x y; % сохранит только переменные с именами x и y
Загрузить данные, сохранённые в файл, можно функцией load:
>> load 'my_data'; % загрузит все данные из файла
>> load 'my_data' x y; % загрузит только переменные с именами x и y
Естественно, вместо x, y могут быть любые переменные в любом количестве
Слайд 25Файлы csv
csv-файлы содержат данные, разделённые запятыми, точками с запятой или
другими разделителями
Функция чтения файлов формата csv называется csvread:
>> M =
csvread('file.csv', row, col, range);
row, col — с какой строчки/столбца начать
range — вектор вида [R1 C1 R2 C2] задаёт область считывания
параметры row, col и range не являются обязательными
Функция записи файлов формата csv называется csvwrite:
>> csvwrite('my_file.csv', A); % A — матрица
Слайд 26Файлы xls
XLS — всем знакомые таблицы Excel. Чтение осуществляется функцией
xlsread. Способов её использования множество, перечислю лишь некоторые из них:
>>
M = xlsread('file.xls'); % считывает все числовые данные на 1 листе
>> M = xlsread('file.xls', -1); % открывает Excel, можно выбрать поля для считывания
>> M = xlsread('file.xls', sheet, 'range'); % считывает с заданного листа диапазон ячеек
[num, txt, raw] = xlsread('file.xls', ...); % записывает в массив num числовые данные, в txt — текстовые, а в массив ячеек raw — все
Запись данных в xls-файл (xlswrite):
>> xlswrite(’MyFile.xls’, M, ’SheetName’)
Слайд 27Работа с текстовыми файлами (I)
Для того, чтобы считать данные из
текстового файла, нужно его сначала открыть функцией fopen:
>> fid =
fopen('someFile.ext'); % теперь fid хранит идентификатор файла
После окончания работы с файлом не забывайте его закрывать (fclose):
>> fclose(fid);
Функция чтения файлов textscan работает с файлами, имеющими определённую внутреннюю структуру
>> C = textscan(fid, 'format');
>> C = textscan(fid, 'format', N);
>> C = textscan(fid, 'format', param, value, ...);
>> C = textscan(fid, 'format', N, param, value, ...);
Параметр 'format' задаёт структуру считывания
В нём допустимы любые символы, разделяющие значения и набор шаблонов
Слайд 28Работа с текстовыми файлами (II). Шаблоны
Приведу основные шаблоны, используемые в
функции textscan:
Слайд 29Пример применения textscan
Пусть есть файл следующего содержания (значения разделены пробелами):
"ENIAC"
1946 500000$ 150kW
"EDSAC" 1949 600000$ 12kW
"CSIRAC" 1949 650000$ 30kW
Тогда
одним из возможных использований функции textscan будет такое:
>> C = textscan(fid, '%q%u%u%c%u%s');
C — ячеечный массив, каждый элемент которого содержит столбец из файла.
Слайд 30Резюме
К составным структурам данных относятся
ячеечные массивы
структуры
структурные массивы
Хэндлы – управление графикой
Анимация
– это изменение графика кадр за кадром
В Matlab есть возможность
считывания данных из файлов:
xls
csv
структурированных текстовых
и др.