Основы программирования в MatLab
Основные математические функции и структура программы пакета MatLab. Операции над матрицами и векторами. Условные операторы и циклы в MatLab. Работа с графиками в MatLab, отображение трехмерных графиков и растровых изображений. Работа с файлами в MatLab.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курс лекций |
Язык | русский |
Дата добавления | 24.05.2016 |
Размер файла | 729,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Рис. 3.8. Пример работы функции axis()
В заключении данного параграфа рассмотрим возможности создания подписей графиков, осей и отображения сетки на графике. Для этого используются функции языка MatLab, перечисленные в табл. 3.4.
Таблица 3.4. Функции оформления графиков
Название |
Описание |
|
grid [on, off] |
Включает/выключает сетку на графике |
|
title(`заголовок графика') |
Создает надпись заголовка графика |
|
xlabel(`подпись оси Ox') |
Создает подпись оси Ox |
|
ylabel(`подпись оси Oy') |
Создает подпись оси Oy |
|
text(x,y,'текст') |
Создает текстовую надпись в координатах (x,y). |
Рассмотрим работу данных функций в следующем примере:
x = 0:0.1:2*pi;
y = sin(x);
plot(x,y);
axis([0 2*pi -1 1]);
grid on;
title('The graphic of sin(x) function');
xlabel('The coordinate of Ox');
ylabel('The coordinate of Oy');
text(3.05,0.16,'\leftarrow sin(x)');
Из результата работы данной программы, представленного на рис. 3.9, видно каким образом работают функции создания подписей на графике, а также отображение сетки графика.
Таким образом, используя описанный набор функций и параметров, можно достичь желаемого способа оформления графиков в системе MatLab.
Рис. 3.9. Пример работы функций оформления графика
3.3 Отображение трехмерных графиков
Программа MatLab обладает рядом инструментов для визуализации графиков в трехмерном пространстве. Такие задачи обычно возникают при отображении графиков функций типа .
В самом простом случае, для визуализации графика в трехмерных координатных осях, используется функция
plot3(X,Y,Z);
которая в качестве первых двух аргументов принимает матрицы с координатами точек по осям Ox и Oy соответственно, а в качестве третьего аргумента передается матрица значений точек по оси Oz. Рассмотрим работу данной функции на примере отображения графика функции
,
при и .
Сформируем матрицы X и Y, содержащие координаты точек данного графика по осям Ox и Oy соответственно. Данные матрицы нужны для того, чтобы функция plot3() «знала» какие реальные координаты соответствуют точке Z(i,j) матрицы значений по оси Oz. Для этого достаточно взять i-ю и j-ю компоненту матриц
Формирование матриц X и Y можно осуществить с помощью функции
[X,Y]=meshgrid(x,y);
языка MatLab. Здесь x и y - одномерные векторы значений координат по осям Ox и Oy соответственно, которые можно сформировать как
x=-1:0.1:1; % координаты точек по оси Ox
y=-2:0.1:2; % координаты точек по оси Oy
и, затем, вычислить матрицы [X,Y]=meshgrid(x,y); % матрицы координат точек по осям Ox и Oy
В результате, матрицы X и Y будут содержать следующие первые восемь значений по строкам и столбцам:
Матрица X:
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
-1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3
Матрица Y:
-2 -2 -2 -2 -2 -2 -2 -2
-1,9 -1,9 -1,9 -1,9 -1,9 -1,9 -1,9 -1,9
-1,8 -1,8 -1,8 -1,8 -1,8 -1,8 -1,8 -1,8
-1,7 -1,7 -1,7 -1,7 -1,7 -1,7 -1,7 -1,7
-1,6 -1,6 -1,6 -1,6 -1,6 -1,6 -1,6 -1,6
-1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5
-1,4 -1,4 -1,4 -1,4 -1,4 -1,4 -1,4 -1,4
-1,3 -1,3 -1,3 -1,3 -1,3 -1,3 -1,3 -1,3
Используя данные матрицы, можно вычислить значения матрицы Z, следующим образом:
Z=exp(-X.^2-Y.^2);
и отобразить результат на экране plot3(X,Y,Z);
Рис. 3.10. Пример отображения графика с помощью функции plot3()
Из приведенного рисунка видно, что функция plot3() отображает график в виде набора линий, каждая из которых соответствует сечению графика функции вдоль оси Oy.
Такое представление графика не всегда удобно, т.к. набор одномерных не дает полное представление о характере двумерной плоскости. Более лучшей визуализации можно получить, используя функцию mesh(X,Y,Z); % отображение графика в виде сетки
В результате получим следующий вид трехмерного графика (рис. 3.11).
Благодаря использованию функции mesh() получается график, образованный интерполяцией точек массивов X, Y и Z линиями по осям Ox и Oy. Кроме того, цветом указывается уровень точки по оси Oz: от самого малого значения (синего) до самого большого (красного) и производится удаление «невидимых» линий. Это позволяет лучше визуально оценивать структуру трехмерного графика по сравнению с функцией plot3(). Если же необходимо отобразить «прозрачный» график, то следует выключить режим удаления «невидимых» линий:
hidden off; % скрытые линии рисуются
В системе MatLab предусмотрена функция визуализации непрерывной поверхности в трехмерных осях surf(X,Y,Z); % отображение непрерывной поверхности
В результате получается график, представленный на рис. 3.12.
Рис. 3.11. Результат работы функции mesh()
Рис. 3.12. Результат работы функции surf()
Функция surf() может использоваться в режиме shading interp; % интерполяция тени на гранях графика которая интерполирует цвет на гранях для получения более гладкого изображения поверхности (рис. 3.13). Также существует возможность менять цветовую карту отображения графика с помощью функции colormap( <карта> ); % установка цветовой карты
Например, карта с именем hot, используемая по умолчанию может быть заменена на любую другую доступную (hot, hsv, gray, pink, cool, bone copper) или созданную самостоятельно.
Рис. 3.13. Результат работы функции surf() в режиме shading interp
Следует отметить, что все три функции plot3(), mesh() и surf() могут быть использованы и с одним аргументом Z, который интерпретируется как матрица со значениями точек по оси Oz.
Для масштабирования отдельных участков трехмерных графиков, также как и в случае с двумерными графиками, используется функция
axis([xmin xmax ymin ymax zmin zmax]);
с очевидным набором параметров.
Для оформления трехмерных графиков можно пользоваться описанными ранее функциями: text, xlabel, ylabel, zlabel, title, grid [on/off], subplot.
Наконец, для трёхмерных графиков существует возможность изменять точку их обзора, т.е. положение виртуальной камеры с помощью функции
view([az el]);
где az - угол азимута; el - угол возвышения. Изменение первого угла означает вращение плоскости xOy вокруг оси Oz против часовой стрелки. Угол возвышения есть угол между направлением на камеру и плоскостью xOy.
3.4 Отображение растровых изображений
Система MatLab позволяет загружать, отображать и сохранять растровые изображения, представленные в известных графических форматах: bmp, jpg, tiff, gif, png и т.д. Для загрузки изображений используется функция
imread(FILENAME,FMT);
которой в качестве параметров передается путь с указанием графического файла и формат. На выходе дается массив, соответствующий размерности изображения со значениями в формате uint8:
A=imread('1024.bmp','bmp'); % A - 1024x1024 матрица uint8
Если исходное изображение имеет глубину цвета не более 256, то матрица A будет двумерной и каждое ее значение будет представлять соответствующий уровень яркости точки. Если же точка исходного изображения представляется, например, 24 битами (3 байта), то матрица А будет иметь размерность 1024x1024x3, где третья размерность будет соответствовать цветовым составляющим исходного изображения. Поэтому для обработки изображений в экспериментальных целях часто используют формат с 256 градациями серого без индексации цвета.
Формат uint8 не очень удобен для последующей обработки точек изображения, поэтому обычно его приводят к вещественному следующим образом:
A=double(imread('1024.bmp','bmp'));
В результате матрица А будет состоять из элементов типа double.
Для отображения растровых изображений в графическом окне используется функция image(A); результат действия которой показан на рис. 3.14.
Неверное отображение изображения объясняется несоответствием палитры цветов по умолчанию (hot), заданное в MatLab, с палитрой цветов загруженного изображения (gray(256) ). Для замены одной палитры на другую используется функция colormap(gray(256)); которая в данном случае задает палитру 256 градаций серого и результат отображения принимает вид, представленный на рис. 3.15.
Рис. 3.14. Результат работы функции image
Рис. 3.15. Коррекция цветовой палитры функцией colormap
Если цветовая палитра заранее неизвестна на момент загрузки изображения, то ее можно узнать, используя второй возвращаемый параметр функции imread:
[A, map]=imread(`1024.bmp','bmp');
image(A);
colormap(map);
где map - цветовая карта текущего изображения.
При работе с изображениями возникают ситуации, когда диапазон значений элементов матрицы A может не соответствовать диапазону значений цветовой карты, например, gray(256). В результате отображения такой матрицы на экране монитора изображение будет показываться некорректно и некоторые его детали будут незаметны. Чтобы избежать такой ситуации, диапазон значений и диапазон цветовой карты должны совпадать. Это можно сделать искусственно, масштабируя соответствующим образом значения элементов матрицы А. Однако MatLab предоставляет функцию imagesc(A); которая делает это автоматически. Благодаря ее использованию, масштаб значений матрицы А всегда будет приведен к масштабу цветовой карты.
ГЛАВА 4. ПРОГРАММИРОВАНИЕ ФУНКЦИЙ В MATLAB
Часто при программировании приходится много раз повторять одни и те же вычисления, например, определение модуля числа или расчет евклидового расстояния между точками и т.п. Для реализации таких повторяющихся вычислений целесообразно создавать функции и вызывать их по мере необходимости.
4.1 Порядок определения и вызова функций
В первой главе данного пособия был показан порядок определения собственных функций в программе MatLab. В данном параграфе остановимся на более подробном описании программирования пользовательских функций.
Синтаксис для определения собственных функций в MatLab имеет следующий вид:
function [ RetVal1, RetVal2,… ] = FunctionName( arg1, arg2,… )
<тело функции>
где RetVal1, RetVal2,... - набор возвращаемых значений функцией (результаты работы); arg1, arg2,... - набор входных аргументов; тело функции - набор операторов (программа), которые выполняются при вызове функции.
Рассмотрим пример реализации функции для вычисления евклидового расстояния:
function length = euqlid(x1, y1, x2, y2)
length = sqrt((x1-x2)^2+(y1-y2)^2);
Продемонстрируем возможность возвращения нескольких параметров на примере вычисления ширины и высоты прямоугольника, заданного координатами левого верхнего угла (x1,y1) и правого нижнего (x2,y2):
function [width, height] = RectangleHW(x1,y1,x2,y2)
width = abs(x1-x2);
height = abs(y1-y2);
Данную функцию можно записать еще и с таким набором параметров:
function [width, height] = RectangleHW(P1, P2)
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
где P1 и P2 - векторы (массивы) размером в 2 элемента и описывают точку в двумерном пространстве. В этом случае при вызове функции, значения координат точек можно передавать таким образом:
[W, H] = RectangleHW([0 0], [10 20]);
Если же программист сделает ошибку и при вызове функции передаст неверный размер вектора, например, так
[W, H] = RectangleHW(0, [10 20]);
то выполнение функции завершится с ошибкой и выполнение всего алгоритма остановится. Чтобы избежать этой ситуации MatLab позволяет проводить проверку корректности переданных аргументов и корректно завершать работу функции без остановки работы всего алгоритма. Следующий пример записи функции демонстрирует работу такой проверки:
function [width, height] = RectangleHW(P1, P2)
if length(P1) < 2 | length(P2) < 2
error( 'Bad 1st or 2nd parameter' );
end
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
При выполнении данной функции с неверными параметрами, функция выдаст сообщение об ошибке в командное окно MatLab, но программа продолжит свою работу.
Предложенная проверка осуществляет контроль за корректностью переданных аргументов. Однако важной является также проверка числа переданных входных аргументов и числа возвращаемых значений функцией. Например, если вместо двух аргументов, был передан только один, то функция ошибочно завершит свою работу. Аналогично, если функция ожидает возврата трех аргументов, в то время как она определена лишь для двух, то также возникнет ошибочная ситуация.
Для проверки числа переданных аргументов и числа ожидающих возвращаемых значений используются переменные nargin и nargout. Ниже приведен пример функции, использующей проверку корректности числа входных и выходных аргументов.
function [width, height] = RectangleHW(P1, P2)
if nargin ~= 2
error( 'Bad number of parameters' );
end
if nargout ~= 2
error( 'Must be 2 return values' );
end
if length(P1) < 2 | length(P2) < 2
error( 'Bad 1st or 2nd parameter' );
end
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
При этом проверки корректности параметров функции будут срабатывать в следующих ситуациях:
[W, H] = RectangleHW([0 0]); % Bad number of parameters
[W, H, V] = RectangleHW([0 0], [10 20]); % Must be 2 return
% values
[W, H] = RectangleHW(0, [10 20]); % Bad 1st or 2nd parameter
4.2 Область видимости переменных
Следует отметить, что переменные, объявленные внутри функций, имеют область видимости только в пределах функции, и за ее пределами уже не доступны (не видны). Следующий пример программы демонстрирует механизм области видимости имен переменных в MatLab:
function MyFunc
x = 10;
disp(x);
MyFunc2();
function MyFunc2()
disp(x);
В результате на экране будет отображено 10 ??? Undefined function or variable 'x'.
Этот пример показывает, что переменная с именем x, объявленная в функции MyFunc, не доступна в функции MyFunc2. Это сделано с расчетом, чтобы переменные в разных функциях не влияли друг на друга даже если они имеют одни и те же имена. Однако в некоторых случаях требуется, чтобы переменная была видна за пределами функции, в которой объявлена. Это достигается путем обращения к переменной как к глобальной с помощью ключевого слова global, за которым следует имя глобальной переменной. Перепишем пример, представленный выше с использованием глобальной переменной:
function MyFunc
x = 10;
disp(x);
MyFunc2();
function MyFunc2()
global x;
disp(x);
Обратите внимание, что ключевое слово global написано в функции MyFunc2 и говорит о том, что переменная x уже объявлена ранее и нужно ее использовать внутри текущей функции.
ГЛАВА 5. РАБОТА С ФАЙЛАМИ В MATLAB
Создание программ часто предполагает сохранение результатов расчетов в файлы для их дальнейшего анализа, обработки, хранения и т.п. В связи с этим в MatLab реализованы различные функции по работе с файлами, содержащие данные в самых разных форматах. В этой главе рассмотрим наиболее полезные функции для сохранения и загрузки результатов работы алгоритмов из файлов.
5.1 Функции save и load
В самом простом случае для сохранения и последующей загрузки каких-либо данных в MatLab предусмотрены две функции
save <имя файла> <имена переменных> % сохранение данных
load <имя файла> <имена переменных> % загрузка данных
Функция save позволяет сохранять произвольные переменные программы в файл, который будет (по умолчанию) располагаться в рабочем каталоге (обычно поддиректория work) и иметь расширение mat. Соответственно функция load позволяет загрузить из указанного mat-файла ранее сохраненные переменные. Ниже представлен пример использования данных функций:
function save_load
x = ones(5);
y = 5;
s = 'hello';
save params x y s;
x = zeros(5);
y = 0;
s = '';
load params x y s;
disp(x);
disp(y);
disp(s);
В данной программе сначала выполняется инициализация переменных x, y, s, затем, они сохраняются в файл params.mat, заменяются другими значениями и после загрузки отображаются на экране. При выполнении этой программы на экране будут показаны те же значения переменных, которые они принимали в самом начале. Таким образом демонстрируется работа функций save и load.
Следует обратить внимание, что функция load позволяет загружать из mat-файла не все, а только указанные программистом переменные, например
load params x; % загружает только значение переменной x
load params y; % загружает только значение переменной y
load params x s; % загружает значения переменных x и s
5.2 Функции fwrite и fread
Недостатком рассмотренных функций save и load является то, что они работают с определенными форматами файлов (обычно mat-файлы) и не позволяют загружать или сохранять данные в других форматах. Между тем бывает необходимость загружать информацию, например, из бинарных файлов, созданных другими программными продуктами для дальнейшей обработки результатов в MatLab. С этой целью были разработаны функции
fwrite(<идентификатор файла>, <переменная>, <тип данных>);
и
<переменная>=fread(<идентификатор файла>);
<переменная>=fread(<идентификатор файла>, <размер>);
<переменная>=fread(<идентификатор файла>, <размер>, <точность>);
Здесь <идентификатор файла> - это указатель на файл, с которым предполагается работать. Чтобы получить идентификатор, используется функция
<идентификатор файла> = fopen(<имя файла>,<режим работы>);
где параметр <режим работы> может принимать значения, приведенные в табл. 5.1.
Таблица 5.1. Режимы работы с файлами в MatLab
параметр <режим работы> |
описание |
|
'r' |
чтение |
|
'w' |
запись (стирает предыдущее содержимое файла) |
|
'a' |
добавление (создает файл, если его нет) |
|
'r+' |
чтение и запись (не создает файл, если его нет) |
|
'w+' |
чтение и запись (очищает прежнее содержимое или создает файл, если его нет) |
|
'a+' |
чтение и добавление (создает файл, если его нет) |
|
'b' |
дополнительный параметр, означающий работу с бинарными файлами, например, `wb', `rb' `rb+', `ab' и т.п. |
Если функция fopen() по каким-либо причинам не может корректно открыть файл, то она возвращает значение -1. Ниже представлен фрагмент программы записи и считывания данных из бинарного файла:
A = [1 2 3 4 5];
fid = fopen('my_file.dat', 'wb'); % открытие файла на запись
if fid == -1 % проверка корректности открытия
error('File is not opened');
end
fwrite(fid, A, 'double'); % запись матрицы в файл (40 байт)
fclose(fid); % закрытие файла
fid = fopen('my_file.dat', 'rb'); % открытие файла на чтение
if fid == -1 % проверка корректности открытия
error('File is not opened');
end
B = fread(fid, 5, 'double'); % чтение 5 значений double
disp(B); % отображение на экране
fclose(fid); % закрытие файла
В результате работы данной программы в рабочем каталоге будет создан файл my_file.dat размером 40 байт, в котором будут содержаться 5 значений типа double, записанных в виде последовательности байт (по 8 байт на каждое значение). Функция fread() считывает последовательно сохраненные байты и автоматически преобразовывает их к типу double, т.е. каждые 8 байт интерпретируются как одно значение типа double.
В приведенном примере явно указывалось число элементов (пять) для считывания из файла. Однако часто общее количество элементов бывает наперед неизвестным, либо оно меняется в процессе работы программы. В этом случае было бы лучше считывать данные из файла до тех пор, пока не будет достигнут его конец. В MatLab существует функция для проверки достижения конца файла feof(<идентификатор файла>) которая возвращает 1 при достижении конца файла и 0 в других случаях. Перепишем программу для считывания произвольного числа элементов типа double из входного файла.
fid = fopen('my_file.dat', 'rb'); % открытие файла на чтение
if fid == -1
error('File is not opened');
end
B=0; % инициализация переменной
cnt=1; % инициализация счетчика
while ~feof(fid) % цикл, пока не достигнут конец файла
[V,N] = fread(fid, 1, 'double'); %считывание одного
% значения double (V содержит значение
% элемента, N - число считанных элементов)
if N > 0 % если элемент был прочитан успешно, то
B(cnt)=V; % формируем вектор-строку из значений V
cnt=cnt+1; % увеличиваем счетчик на 1
end
end
disp(B); % отображение результата на экран
fclose(fid); % закрытие файла
В данной программе динамически формируется вектор-строка по мере считывания элементов из входного файла. MatLab автоматически увеличивает размерность векторов, если индекс следующего элемента на 1 больше максимального. Однако на такую процедуру тратится много машинного времени и программа начинает работать заметно медленнее, чем если бы размерность вектора B с самого начала была определена равным 5 элементам, например, так
B = zeros(5,1);
Следует также отметить, что функция fread() записана с двумя выходными параметрами V и N. Первый параметр содержит значение считанного элемента, а второй - число считанных элементов. В данном случае значение N будет равно 1 каждый раз при корректном считывании информации из файла, и 0 при считывании служебного символа EOF, означающий конец файла. Приведенная ниже проверка позволяет корректно сформировать вектор значений B.
С помощью функций fwrite() и fread() можно сохранять и строковые данные. Например, пусть дана строка
str = 'Hello MatLab';
которую требуется сохранить в файл. В этом случае функция fwrite() будет иметь следующую запись:
fwrite(fid, str, 'int16');
Здесь используется тип int16, т.к. при работе с русскими буквами система MatLab использует двухбайтовое представление каждого символа. Ниже представлена программа записи и чтения строковых данных, используя функции fwrite() и fread():
fid = fopen('my_file.dat', 'wb');
if fid == -1
error('File is not opened');
end
str='Привет MatLab'; % строка для записи
fwrite(fid, str, 'int16'); % запись в файл
fclose(fid);
fid = fopen('my_file.dat', 'rb');
if fid == -1
error('File is not opened');
end
B=''; % инициализация строки
cnt=1;
while ~feof(fid)
[V,N] = fread(fid, 1, 'int16=>char'); % чтение текущего
% символа и преобразование
% его в тип char
if N > 0
B(cnt)=V;
cnt=cnt+1;
end
end
disp(B); % отображение строки на экране
fclose(fid);
Результат выполнения программы будет иметь вид
Привет MatLab
5.3 Функции fscanf и fprintf
Описанные выше функции работы с файлами позволяют записывать и считывать информацию по байтам, которые затем требуется правильно интерпретировать для преобразования их в числа или строки. В то же время выходными результатами многих программ являются текстовые файлы, в которых явным образом записаны те или числа или текст. Например, при экспорте данных из MS Excel можно получить файл формата
174500,1.63820,1.63840,1.63660,1.63750,288
180000,1.63740,1.63950,1.63660,1.63820,361
181500,1.63830,1.63850,1.63680,1.63740,223
183000,1.63720,1.64030,1.63720,1.64020,220
где числа записаны в столбик и разделены запятой.
Прочитать такой файл побайтно, а затем интерпретировать полученные данные довольно трудоемкая задача, поэтому для этих целей были специально разработаны функции чтения
[value, count] = fscanf(fid, format, size)
и записи
count = fprintf(fid, format, a,b,...)
таких данных в файл. Здесь value - результат считывания данных из файла; count - число прочитанных (записанных) данных; fid - указатель на файл; format - формат чтения (записи) данных; size - максимальное число считываемых данных; a,b,.. - переменные для записи в файл.
Приведем пример чтения данных из файла, приведенного выше с помощью функции fscanf():
function fscanf_ex
fid = fopen('my_excel.dat', 'r');
if fid == -1
error('File is not opened');
end
S = fscanf(fid, '%d,%f,%f,%f,%f,%d');
fclose(fid);
Здесь форматная строка состоит из спецификаторов
%d - работа с целочисленными значениями;
%f - работа с вещественными значениями
и записана в виде '%d,%f,%f,%f,%f,%d'. Это означает, что сначала должно быть прочитано целочисленное значение из файла, затем, через запятую должно читаться второе вещественное значение, затем третье и так далее до последнего целочисленного значения. Полный список возможных спецификаторов приведен в табл. 5.2.
В результате работы программы переменная S будет представлять собой вектор-столбец, состоящий из 24 элементов:
S = [174500 1,6382 1,6384 1,6366 1,6375 288 180000 1,6374 1,6395 1,6366 1,6382 361 181500 1,6383 1,6385 1,6368 1,6374 223 183000 1,6372 1,6403 1,6372 1,6402 220]';
Несмотря на то, что данные были корректно считаны из файла, они из таблицы были преобразованы в вектор-столбец, что не соответствует исходному формату представления данных. Чтобы сохранить верный формат данных, функцию fscanf() в приведенном примере следует записать так:
S = fscanf(fid, '%d,%f,%f,%f,%f,%d', [6 4]);
Тогда на выходе получится матрица S размером в 6 столбцов и 4 строки с соответствующими числовыми значениями.
Таблица 5.2. Список основных спецификаторов для функций fscanf() и fprintf()
Спецификатор |
Описание |
|
%d |
целочисленные значения |
|
%f |
вещественные значения |
|
%s |
строковые данные |
|
%c |
символьные данные |
|
%u |
беззнаковые целые значения |
Для записи данных в текстовый файл в заданном формате используется функция fprintf(). Ниже представлен пример записи матрицы чисел
180000 1.28210 1.28240 1.28100 1.28120 490
190000 1.28100 1.28150 1.27980 1.28070 444
200000 1.28050 1.28080 1.27980 1.28000 399
210000 1.27990 1.28020 1.27880 1.27970 408
220000 1.27980 1.28060 1.27880 1.28030 437
230000 1.28040 1.28170 1.28020 1.28130 419
000000 1.28140 1.28140 1.28010 1.28100 294
010000 1.28080 1.28190 1.28030 1.28180 458
020000 1.28190 1.28210 1.28080 1.28140 384
030000 1.28130 1.28170 1.28080 1.28140 313
в файл, в котором числовые значения должны разделяться точкой с запятой. Будем также предполагать, что данная матрица хранится в переменной Y.
function fprintf_ex
fid = fopen('my_excel.txt', 'w');
if fid == -1
error('File is not opened');
end
fprintf(fid, '%6d;%.4f;%.4f;%.4f;%.4f;%d\r\n', Y');
fclose(fid);
Следует отметить, что в функции fprintf() переменная Y имеет знак транспонирования `, т.к. данные в файл записываются по столбцам матрицы. Кроме того, перед спецификаторами стоят числа, которые указывают сколько значащих цифр числа должно быть записано в файл. Например, спецификатор %6d говорит о том, что целые числа должны иметь 6 значащих цифр, а спецификатор %.4f означает, что после запятой будет отображено только 4 цифры. Наконец, в форматной строке были использованы управляющие символы
\r - возврат каретки;
\n - переход на новую строку
которые необходимы для формирования строк в выходном файле. В итоге, содержимое файла будет иметь вид:
180000;1.2821;1.2824;1.2810;1.2812;490
190000;1.2810;1.2815;1.2798;1.2807;444
200000;1.2805;1.2808;1.2798;1.2800;399
210000;1.2799;1.2802;1.2788;1.2797;408
220000;1.2798;1.2806;1.2788;1.2803;437
230000;1.2804;1.2817;1.2802;1.2813;419
0;1.2814;1.2814;1.2801;1.2810;294
10000;1.2808;1.2819;1.2803;1.2818;458
20000;1.2819;1.2821;1.2808;1.2814;384
30000;1.2813;1.2817;1.2808;1.2814;313
С помощью функции fprintf() можно записать значения двух и более переменных разного формата. Например, для записи числа и строки можно воспользоваться следующей записью:
str = 'Hello';
y = 10;
count = fprintf(fid, '%d\r\n%s\r\n', y, str);
и содержимое файла будет иметь вид:
10
Hello
Таким образом можно осуществлять запись разнородных данных в файл в требуемом формате.
5.4 Функции imread и imwrite
При работе с файлами изображений, представленных в форматах bmp, png, gif, jpeg, tif и т.д., используются функции чтения
[X, map] = imread(filename, fmt)
и записи
imwrite(X, map, filename, fmt)
Здесь X - матрица точек изображения; map - цветовая карта изображения; filename - путь к файлу; fmt - графический формат файла изображения.
Работа функции imread() была подробно рассмотрена в п. 3.4. Ниже приведен пример ее использования для загрузки растрового изображения
[A, map]=imread('1024.bmp','bmp');
где A - матрица размером 1024х1024xN точек; map - цветовая карта загруженного изображения. Значение N показывает число байт, расходуемых на представление точки изображения. Например, если изображение представляется в формате RGB с 24 бит/пиксел, то N=3. Если же загружается изображение с 256 градациями серого (8 бит/пиксел), то N=1.
После обработки изображение A можно обратно сохранить в файл, используя следующую запись:
imwrite(A, map, 'out_img.bmp', 'bmp');
В результате в рабочем каталоге MatLab будет сохранено изображение в формате bmp с исходной цветовой картой. Однако следует отметить, что если загруженное изображение A было преобразовано, например, в формат double
A = double(A);
то непосредственная запись такой матрицы как изображение невозможно. Дело в том, что значения матрицы A должны соответствовать целым числам в диапазоне от 0 до 255, т.е. являться байтовыми числами. Этого можно добиться преобразованием типов при записи изображения в файл следующим образом:
imwrite(uint8(A), map, 'out_img.bmp', 'bmp');
Здесь uint8 - беззнаковый целый тип в 8 бит.
В качестве переменной map можно указывать любые другие цветовые карты (hot, hsv, gray, pink, cool, bone copper) отличные от исходной. Например, для записи изображения в 256 градациях серого можно записать
imwrite(uint8(A), gray(256), 'out_img.bmp', 'bmp');
При этом матрица A должна иметь размерность MxNx1, т.е. один байт на пиксел.
Размещено на Allbest.ru
...Подобные документы
Общие сведения о языке программирования Matlab. Функции работы с векторами и матрицами. Операторы условных переходов. Построение двумерных графиков. Построение гистограммы изображения. Функции его преобразования и зашумления, метрики определения качества.
лабораторная работа [853,5 K], добавлен 25.10.2015Изучение программирования в MATLAB. Использование команд Save и Load, операторы ввода и вывода для работы в командном окне. Отладка собственных программ. Интерфейс MATLAB. Отличия поздней версии MATLAB от более ранних. Средство Source Control Interface.
контрольная работа [43,0 K], добавлен 25.12.2011Особенности работы в режиме командной строки в системе Matlab. Переменные и присваивание им значений. Комплексные числа и вычисления в системе Matlab. Вычисления с использованием функции sqrt. Неправильное использование функций с комплексными аргументами.
дипломная работа [1,9 M], добавлен 30.07.2015Зарождение и развитие системы MatLab. Порядок выполнения простых вычислений. Построение логической области в графическом окне. Работа с символьными массивами. Написание функции, выполняющей требуемое задание для матриц и векторов любой размерности.
отчет по практике [761,4 K], добавлен 21.10.2015Назначение и особенности системы MATLAB. Запуск программы, работа в режиме диалога, понятие о сессии, операции строчного редактирования. Формирование векторов и матриц. Графики ряда функций. Знакомство с трехмерной графикой. Интерфейс основного окна.
учебное пособие [65,9 K], добавлен 17.03.2011Назначение и возможности пакета MATLAB. Цель интерполирования. Компьютерная реализация решения инженерной задачи по интерполяции табличной функции различными методами: кусочно-линейной интерполяцией и кубическим сплайном, а также построение их графиков.
контрольная работа [388,3 K], добавлен 25.10.2012Схема речеобразования у человека. Запись и считывание данных из речевого сигнала в MATLAB. Синтаксис вызова функции. Операции над звуковыми файлами. Исследование мужского и женского голосов. Спектрограммы голосов. Обработка речи в Simulink, Wavelet.
контрольная работа [2,2 M], добавлен 18.04.2013Сравнительный анализ Matlab и Mathcad при моделировании динамических систем. Подсистема Simulink пакета MATLAB. Расчёт базовой модели и проведения исследований. Описание математической модели. Векторные и матричные операторы. Нижние и верхние индексы.
курсовая работа [338,5 K], добавлен 06.02.2014Назначение и возможности пакета MATLAB, его основные составляющие. Набор вычислительных функций. Роль интерполяции функций в вычислительной математике. Пример интерполяции с четырьмя узлами. Интерполирование и сглаживание, схемы решения задач в MATLAB.
курсовая работа [594,5 K], добавлен 28.12.2012Графики вещественнозначных функций вещественного переменного. Построение двумерных графиков. Пример построения графика синусоиды. Пример использования функции subplot. Оформление двумерных графиков в системе MatLab. Основные функции оформления графиков.
курсовая работа [826,3 K], добавлен 30.04.2019Использование программного обеспечения MatLab для выполнения математических расчетов в области линейной алгебры, теории информации и обработки сигналов, автоматического и автоматизированного управления. Возможности стандартного интерфейса программы.
курсовая работа [178,7 K], добавлен 08.08.2011Побудова поверхней у математичному пакеті MATLAB по завданій системі рівнянь. Виконання розрахунків та графічних малюнків за допомогою функції surf, що є більш наглядною в порівнянні з plot3. Особливості інтерфейсу користувача даної задачі MATLAB.
лабораторная работа [1,9 M], добавлен 28.08.2015Определение граничных значений параметров, принципов организации из математического пакета программ MatLab. Реализация принципов управляемости и наблюдаемости. Основные методы параметрического оценивания. Реализация принципов идентификации и адекватности.
курсовая работа [2,3 M], добавлен 24.06.2013Язык и среда Matlab. Управляемая графика. Библиотека математических функций. Программный интерфейс. Использование операторов при составлении выражений. Работа в командной строке. Команды save, load и clear. Рабочий каталог. Сохранение рабочей сессии.
презентация [413,6 K], добавлен 14.11.2013Исследование линейных динамических моделей в программном пакете Matlab и ознакомление с временными и частотными характеристиками систем автоматического управления. Поиск полюса и нуля передаточной функции с использованием команд pole, zero в Matlab.
лабораторная работа [53,1 K], добавлен 11.03.2012Программный комплекс MATLAB как мощное средство для высокоточного цифрового моделирования системы автоматического управления. Основные особенности построения временных характеристик с помощью пакета Control System и моделирования в системе Simulink.
контрольная работа [2,3 M], добавлен 14.11.2012Ознайомлення з операціями середовища MatLAB на прикладі використання стандартних функцій, побудови файлів-сценаріїв і створення функцій користувача. Роботи з матрицями і векторами в середовищі MatLAB, рішення тригонометричних функцій, побудова графіків.
лабораторная работа [11,2 M], добавлен 21.05.2019Анализ возможностей пакета MATLAB и его расширений. Язык программирования системы. Исследование выпрямительного устройства. Моделирование трёхфазного трансформатора. Схема принципиальная регулируемого конвертора. Возможности гибкой цифровой модели.
презентация [5,1 M], добавлен 22.10.2013Matlab - матричная лаборатория - система программирования для научно-технических расчетов. Особенности ввода векторов. Специальные матрицы, простые команды. Простые примеры, иллюстрирующие эффективность Matlab. Графический способ решения уравнений.
реферат [46,3 K], добавлен 05.01.2010Создание и представление символьных переменных в программе Matlab, операции над полиномами и упрощение выражений. Пример подстановки значения в функцию, решения уравнений и систем, дифференцирования, интегрирования и вычисления пределов функций.
презентация [359,2 K], добавлен 24.01.2014