Matlab
Статистические методы
Нейронные сети
Matlab
Matlab - язык программирования и пакет прикладных программ для решения технических задач и приложений. Так-то.
В Matlab есть хороший справочник функций, при любых вопросах - в первую очередь смотреть туда. Доступен на вкладке Help.
Внешний Matlab вид на рис. 1.
РРис. 1.
Переменные
Отличительная особенность языка Matlab - отсутствие необходимости инициализировать переменные и указывать тип данных (в отличие от других языков). Например, для создания переменной A и присвоения ей значения (будет 10) необходимо ввести
А = 10
С переменными можно выполнять любые арифметические действия как и в любом другом языке программирования:
B = 15
C = 10 + 15
В ответ командная строка напишет что-то вроде:
C =
25
ежели конечный результат не является переменной, создаётся переменная ans, которой присваивается результат. Например, ежели набрать в командной строке:
10+15
В ответ командная строка выдаст:
ans =
25
Для отключения вывода результата в командную строку в конце команды необходим сивмол;
Например, после следующей команды результат будет сохранён в переменную ans и не будет выведен в командную строку:
10+15;
Написание программ
В распространённых языках программирования (например, Си) любая программа должна иметь точку входа — функцию main(), которая выполняется первой. Кроме того, в них необходимо подключать различные файлы библиотек, с которыми будет производится работа в программе. В Matlab всего этого делать не нужно.
Для выполнения простых команд достаточно вписывать их в командную строку. Но для удобства используют скрипты. Они имеют расширение.m и создаются через: File -> New -> Script. В скриптах выполнение кода происходит с верхней строки, последовательно.
После написания нажать F5 для запуска кода.
Комментарии в коде начинаются с символа %
Множественные комментарии отсутствуют, но можно выделить текст и нажать ctrl+R для комментирования блока кода, раскомментирование блока кода производится нажатием ctrl+T.
Перенос строки
Ежели команда слишком длинная, её можно разделить на несколько строк, при этом для переноса строки нужно в конце написать:... (три точки)
Циклы и условия
Отличие от других языков программирования в отсутствии фигурных скобок. Цикл начинается со слова while или for и заканчивается словом end. Во вложенных циклах каждому условию\циклу должен соответствовать свой end.
Пример использования цикла for
for i=1:2:10
% do something here
end
Здесь 1:2:10 - начальное значение=1, шаг=2, конечное значение=10. ежели шаг = 1, то его можно не указывать: for i=1:10.
Пример использования цикла while
while var1==1
% do something here
end
Множественный условный цикл if
if p==1
% do something here
elif p==2
% do anything else here
else
% do anything else here
end
В коде каждая строка вложенного цикла имеет отступ. Он необходим только для удобства чтения, ставится кнопкой tab или автоматически нажатием enter в конце предыдущей строки.
Логические операторы: логическое или: ||, логическое и: &&
коде каждая строка вложенного цикла имеет отступ. Он необходим только для удобства чтения, ставитс
Массивы
Массив в Matlab - одномерная (вектор) или двумерная (матрица) упорядоченная последовательность значений. Нумерация в массиве начинается с единицы (в других языка - с нуля).
Обращение к элементам массива происходит так:
массив(строка, столбец)
например, присвоение значения 5го элемента массива переменной vec5:
vec5 = vector1(5);
Помимо числовых массивов (включают как целые, так и числа с запятой), массивы могут содержать строковые данные (т.е. буквенные символы). В этом случае массив преобразуется в массив ячеек, называемый cell. В массиве cell все данные, даже числовые преобразуются к строковому виду, обращение к любому элементу осуществляется через фигурные скобки:
массив_ячеек{строка, столбец}
Преобразование массива cell к нормальному виду с помощью функции:
cell2mat(cell_array);
Заполнение массива вручную:
array1 = [1,2];
Создаётся одномерный вектор из двух элементов.
Заполнение двумерного массива:
array2 = [1,2,3;4,5,6];
Здесь, (запятая) - разделитель элементов строки,; (точка с запятой) - разделитель строк. Таким образом, создаётся массив 2 на 3 (2 строки по 3 столбца, рисунок ниже).
Квадратные скобки [ ] в Matlab используются только при инициализации массива, круглые () — для обращения к элементам массивов и в вызовах функций.
Обращение к нескольким элементам массива происходит с помощью символа: (двоеточие)
array3 = array2(1:2,2:3);
Здесь array3 состоит из части массива array2, включает четыре элемента 1-ой и 2-ой строки (array2(1:2,2:3)) и 2-го и 3-го столбца ((array2(1:2, 2:3),рисунок ниже)
Таким же способом можно заполнять массивы одинаковыми элементами. Например, массив 3 на 3 из единиц:
array_of_ones(1:3,1:3) = 1;
Точно так же можно изменять содержимое сущесвтующих массивов. Например
array_of_ones(2:3,2:3) = 0;
обнулит элементы пересечения 2 и 3 строки и столбца (рисунок ниже)
Ежели вокруг двоеточия при указании элементов массива цифры не указаны, то автоматически выбирается весь диапазон. Например, следующий код выделит всю первую строку (3 эелемента):
first_row = array_of_ones(1,:);
Встроенные функции создания массив из единиц:
ones(row,col);
zeros(row,col);
где row - число строк, col - число столбцов
Объединение массивов происходит точно так же, как и создание массива вручную, только вместо цифр используются массивы.
Пусть массив array4 имеет размерность 3x2, массив array5 - 3x3, тогда объединённый (горизонтально, по строкам) массив array6 будет иметь размерность 3х5:
array4 = zeros(3,2); % массив 3х3 из нулей
array5 = ones(3,3); % массив 3х3 из единиц
array6 = [array4,array5]; % конечный массив 3х5
Первые 2 столбца массива array6 будут состоять из нулей, следующие 3 - из единиц.
Заполнение вручную через цикл
Заполнение двумерного массива 5 на 3 (5 строк по 3 столбца) через цикл for:
for i=1:5
for j=1:3
array1(i,j) = i*3+j;
end
end
Удаление строки из массива:
array6(1,:) = [];
Удалится вся первая строка массива. После этого размерность массива по строкам уменьшится на единицу. Аналогично
array6(:,2) = [];
удалит второй столбец.
Транспонирование массива - нужно добавить символ ' (апостроф):
array_transposed = array6';
Математические операции с массивами: математические операции с массивом и числом происходят как и обычно, умножение и деление массива на массив происходит по правилам матричной алгебры. Для поэлементного умножения \ деления двух массивов одинаковой размерности необходимо перед математическим оператором поставить символ. (точка):
array1 = [1, 2, 3; 1, 2, 3];
array2 = [2, 2, 2; 3, 3, 3];
array3 = array1.*array2
Результат:
array3 =
2 4 6
3 6 9
Чтение из файла
Ежели файл с исходными данными записан в формате xls (Эксель):
[num_data text_data raw_data] = xlsread(' file_name.xls ');
Читаемый файл должен находиться в рабочей папке, в противном случае нужно указывать путь до файла.
Здесь num_data - массив, в который положатся все числовые данные, тип данных - интежер или флоат, как повезёт; text_data - массив, в котором будут все текстовые данные, формата чар; и raw_data - массив всех элементов исходного файла смешанного формата (cell).
Ежели файл с исходными данными записан в другом формате (.txt,.dat, др.), то пользуются невероятной функцией textscan():
fileID = fopen(filename,'r'); % открыть файл
data_raw = textscan(fileID,'%f %f'); % считать данные
data_cell = cell2mat(data_raw); % Приведение cell к массиву
data_mat = data_cell(:,:); % Приведение cell к массиву
fclose(fileID); % закрыть файл
Здесь %f %f в функции textscan означает, что файл содержит два столбца с числами с плавающей точкой (float). Ежели там целочисленные значения - каждый столбец будет обозначаться %i (integer) или %d (decimal) Ежели там буковки - %s (string, строка символов), %c (char, один символ).
fopen() - функция открытия файла, первый аргумент - название открываемого файла, второй аргумент - режим открытия. 'r' - только для чтения, 'w' - для записи.
Для записи файлов можно использовать функцию fprintf(), с синтаксисом,похожим на textscan(). Точно так же нужно открывать файл (в режиме записи), по окончании закрывать. Например:
fileID = fopen(filename,'w'); % открыть файл
fprintf(fileID,'%s','pew-pew'); % записать одну строковую перем.
fclose(fileID); % закрыть файл
Уточнение по поводу функции fprintf(). Первый аргумент - дескриптор файла, второй аргумент - формат записываемых данных - это одна строка ('%s' из примера выше), по шаблону которой будут записываться все столбцы, может содержать как обычный текст (будет повторяться в каждой строке), так и символы для подстановки (начинаются с %). Третий аргумент - массив, из которого производится подстановка по формату строки.
Для того, чтобы форматирование в записанном файле было корректным, строка формата должна оканчиваться символом конца строки - '\n', т.е. пример выше будет выглядеть как '%s\n'.
Ежели записывается большой файл с большим количеством столбцов, удобно записывать формат с помощью функции repmat(). Эта функция копирует элемент нужное количество раз; принимает 3 аргумента: 1 аргумент - что именно копировать (число, строка, вектор, столбец), 2 аргумент - число строк повторений, 3 аргумент - число стобцов повторений. Например:
repmat('%d ',1,5) создаст следующую строку: '%d %d %d %d %d ', которая повторяется на 1 строку (2 аргумент) и на 5 столбцов (3 аргумент).
Для добавления символа завершения строки можно использовать функцию strcat() - это функция, объединяющая несколько строк в одну (str от string - строка, cat от con cat enation - объединение). Тогда, если имеется массив array1 размерностью NxM, записать его в файл можно так:
[N M] = size(array1);
fileID = fopen(filename,'w'); % открыть файл
frpintf(fileID, strcat(repmat('%d ', 1, M),'\n'), array1);
fclose(fileID); % закрыть файл
Если что-то идёт не так - возможно array1 нужно транспонировать.
Построение графиков
Для построения двумерных графиков существует функция plot(Х,У). Где X — вектор значений по оси Х, У — по У. Размерности этих двух векторов должны совпадать.
Пример:
Х = 10:20; % создать вектор от 10 до 20 с шагом в 1
У = 30:2:50; % создать вектор от 30 до 50 с шагом в 2
plot(X,Y);
Выведет просто наклонную прямую линию.
Функция plot() имеет возможность принимать дополнительные аргументы для оформления графика. Для изменения цвета необходимо добавить букву: r, k, c, m, y или b. Для изменения символа точек — добавить символ x, o, -, ^ или *. Эти аргументы необходимо вставлять в одинарных кавычках после осей. Например:
plot(X,Y,'oy');
выведет график с линией жёлтого (y, yellow) цвета, где точки будут обозначаться кружочками (o).
Для изменения толщины линии необходим аргумент 'linewidth', затем толщина в пикселях, без кавычек. Например:
plot(X,Y,'linewidth',2);
выведет график с толстой линией (2 пикселя).
Точное изменение цвета — необходим аргумент 'rgb', затем [1.0 1.0 1.0] — где первая цифра означает интенсивность красного цвета (от нуля — минимум, до 1.0 - максимум), вторая — интенсивность зелёного цвета, третья — синего конечно.
Например,
plot(X,Y,'rgb',[1.0,0.5,0.0]);
выведет график оранжевого цвета.
Полный список:
http://www.mathworks.com/help/matlab/ref/linespec.html?requestedDomain=www.mathworks.com
По умолчанию каждое новое построение графика очищает окно с графиками, которое открыто до него, поэтому ежели необходимо наложить несколько графиков - после первого построения нужно написать следующее:
hold on;
Например,
plot(X1,Y1,'r'); % построение 1го графика, красным цветом
hold on; % включение наложения графиков
plot(X2,Y2,'g'); % построение 2го графика синим цветом, наложится на предыдущий график
plot(X3,Y3,'y'); % построение 3-го графика, жёлтым цветом, также наложится, потому что наложение уже включено
Наложенные графики могут выглядеть так:
Для построения одновременно нескольких графиков в разных окнах необходимо перед каждым построением писать следующую строку:
figure;
Например, следующий код создаст два окна со своими графиками
figure; % новое окно
plot(X1,Y1,'r'); % построение графика
figure; % новое окно
plot(X2,Y2,'g'); % построение графика в новом окне
Для того, чтобы создать одно окно с раздельными графиками необходимо использовать функцию subplot(), которая имеет три аргумента: число графиков в окне по вертикали, число графиков в окне по горизонтали, номер текущего графика.
Например, для двух графиков один над другим испольбзуется следующий код:
subplot(2,1,1); % два графика в столбик, один ряд, первый график
plot(X1,Y1,'r'); % малюванне
subplot(2,1,2); % два графика в столбик, один ряд, второй график
plot(X2,Y2,'g'); % малюванне