Matlab
Материал из MachineLearning.
Matlab — язык программирования и система научных и инженерных расчетов, построенная на основе интерпретатора этого языка. Matlab, сокращение от «Matrix Laboratory», предназначен в первую очередь для выполнения алгоритмов, использующих векторы и матрицы.
Язык программирования Matlab (иногда также называется M-code) изначально был разработан с целью упрощения работы с процедурами широко распространенной в 70-80 годы библиотеки алгоритмов линейной алгебры LINPACK. Впоследствии он развился в мощный язык с богатым набором типов данных.
Оболочка Matlab состоит из командной строки, текстового редактора со встроенным отладчиком и окнами со списком файлов, списком видимых переменных и с историей введенных команд.
Matlab имеет большое число пакетов (toolboxes) — как собственных, так и распространяемых независимыми разработчиками часто на условиях открытого кода. В Matlab включен Simulink — визуальный редактор для моделирования динамических систем.
Содержание |
Краткий обзор языка Matlab
Векторы и матрицы
ввести вектор-столбец
vec = [1; 2; 3]
вектор-строку
vec = [1 2 3]
и матрицу
mat = [1 2 3; ... 4 5 6]
задать матрицы
m = 3; n = 2; mat1 = ones(m,n) mat0 = zeros(m,n) mat2 = rand(n,n) mat4 = randn(n,n) mat3 = rand(n,n,n)
задать векторы
vec = [0:0.01:1] vec = [0:100] vec = linspace(0,1,100)
соединить векторы
vec = [0:0.5:1, 2:0.4:3]
добавть элемент к вектору-столбцу
vec(end) vec(end+1) = 3
добавить элемент в вектору-строке
vec = [-1 vec]
векторизовать матрицу
vec = mat4(:)
удалить элементы
idx = find(vec < 0.05) vec(idx) = [] vec=[]
соединить матрицы
mat1 = [1:5]'*[1:5] mat2 = mat1(2:4,2:5) mat2 = mat2' mat2 = [mat1; mat1] mat2 = [mat1, mat1]
текстовая строка - это вектор
i = 2 str = ['The lucky number is ', num2str(i)]
но не наоборот
str = ''; % empty string str = sprintf(' 1 plus%s %d',str,i)
Операции
скалярное произведение
x = [1:5]'; norm = x'*x table = x*x'
умножение матриц
A = rand(5,2) ATA = A'*A ATA1 = inv(ATA) ATA1'*ATA
поэлементные операции
y = 1+x y = x+x y = x.*x Y = A.*A
Типы данных
структура
PP.niter = 100; PP.tolX = 10e-6; PP.display = 1; niter = PP(1).niter; PP
массив ячеек
strarray = {'one','two','et cetera'} strarray = {'north','south';'west','east'} fprintf(1, 'Go to the %s!\n', strarray{1,1});
возвращает ячейку
strarray(1,1) % note that the following item is a cell
возвращает содержимое
strarray{1,1}
Цикл
цикл for
x=rand(5,1); % get some x for i=1:length(x) fprintf(1,'%1.2f\n',x(i)); % some code uses x(i) end
итератор может быть элементом вектора
x=rand(5,1); % get some x idx = find(x>0.5); % find some elements of x to process for i = idx % here idx is integer-valued vector fprintf(1,'%1.2f\n',x(i)); % some code uses x(i) end
или вектором-столбцом матрицы
mat = [1 3 5 7; 2 4 6 8] for i = mat % no need to use additional lines if you deal with vectors fprintf(1,'i'' = %s\n',num2str(i')); end
см. также
doc while % etc.
Условный переход
оператор if использует как логические так и целочисленные переменные; можно использовать операции 'and(a, b)', синоним 'a && b' и 'or(a, b)', синоноим 'a || b'
a = 1; b = 2; c = []; % empty d = NaN; % Non a Number e = -Inf; % Infinity if or (a>b, or( isempty(c), or( isnan(d), isinf(e)))) disp('something remarkeble happens'); end
но удобнее использовать
if any([a>b, isempty(c), isnan(d), isinf(e)]) disp('something remarkeble happens') end
Эффективное программирование
Matlab в своих базовых конструкциях сложнее C/C++, поэтому желательно смотреть чужой код с целью выявления удачных приемов
пример 1, строим усеченную синусоиду, вариант 1
x = [0:0.01*2*pi:2*pi]; % the length of the vector is 101 y = sin(x); % the 1st line y1 = y; % dummy for the 2nd line CONST = 0.2; for i = 1:length(y1) if y1(i) > CONST, % please, do not act like that! y1(i) = CONST; elseif y1(i) < -CONST; y1(i) = -CONST; end end plot(x,y,'r-'); % plot the result hold on plot(x,y1,'b-'); hold off
пример1, вариант 2
n = 100; x = linspace(0,2*pi,n); y = sin(x); idx = find(abs(y) > CONST); % it's better to write y(idx) = sign(y(idx))*CONST; % here the same result in a few lines of code!
следует избегать циклов там, где можно использовать матричные операции;
пример 2, вариант 1
n = 5; x = rand(n,1); A = magic(n); for j = 1:n A(:,j) = A(:,j)*x(j); % multiply some columns by some scalars end
пример 2, вариант 2
n = 5; x = rand(n,1); A = magic(n); A = A*diag(x); % much better
Функции
функции бывают embedded, private, public, inline, см. doc; при написании желательно организовать код так, чтобы функция возвращала корректный результат независимо от того, что было подано в качестве аргумента — скаляр, вектор или матрица
пример, стандартизация вектора
function y = to01(x) y = (x - min(x))./(max(x) - min(x)) return % place the code below in a separate file named 'to01.m' % usage 1: y = to01([1 2 3 4 5]); % usage 2: x = randn(1,20); y = to01(x); min(y) max(y)
функции могут включать варьируемое число входных и выходных аргументов
function [a,b] = somefunc(c,d) if nargin < 2, d = 1; end % some code..., i.e. a = c; if nargout > 1, b = d; end return
выполнение функций как текстовых строк в теле программы
eval('x = [1,2;3,4];') [m,n] = eval('size(x)') mat = feval('rand',2,2)
пример, как сделать случайную k-индексную матрицу
% how to make an [a x b x c x d x ... x e] (k-times) k = 5; % have to generate k-dimantional array dims=randperm(k+1) % let the dimension sizes be random dims(find(dims==1)) = [] % remove the size of 1 str = sprintf('%d,',dims) % type the vector into a string str = sprintf('rand(%s);',str(1:end-1)) % add the rand function mat = eval(str); % evaluate the expression size(mat) % check the size of the obtained multi-dimensional array mat
инлайн-функции — функции задаваемые в теле программы
пример 1
f1 = inline('w(1) + w(2)*x','w','x'); y1 = f1([1 2],3) y1 = f1([1,2],[1:5]') % be care of this; use .-operations
пример 2
f2 = inline('(x - min(x))./(max(x) - min(x))','x'); y2 = f2([1:10])
Рекомендации программистам
- Matlab прост в освоении. Нет понятий проект, компилятор, библиотека.
- Есть командная строка, редактор m-code, path list и help.
- Если вы ходите использовать функцию из toolbox просто используйте ее имя в коде.
- Коллизий имен не существует. Старое имя исчезает при его перезагрузке.
- Функции вызываются по имени согласно path list (см. основное меню). Следите на очередностью в этом списке.
- Почитайте help, если вам нужно написать известный алгоритм, возможно он уже написан.
- В частности, функции, работающие с множествами: intersect, ismember, issorted, setdiff, setxor, union, unique и очень полезная функция is* находятся в Help navigator -> MATLAB -> Functions — Categorical list.
- Wikipedia.org содержит много библиотек для Matlab.
- Не нужно избегать сложных алгоритмов. Часто задачи классификации, регрессии, оптимизации решаются в одну строку кода.
- Желательно документировать свои функции так:
- первая строка — назначение функции
- вторая строка — имя функции и ее входные и выходные аргументы
- варианты использования функции
- пример использования функции
- Изучите все структуры данных в Matlab, их очень много. В последней версии (R2008a) появилась поддержка работы с классами.
- Избегайте циклов, если возможно, используйте операции работы с матрицами.
- Имеется возможность подключать функции, написанные на C (в виде специально скомпилированных библиотек).
Некоммерческие версии
Matlab — коммерческая программа. Существуют некоммерческие варианты, совместимые по базовым конструкциям языка, но не совместимые по библиотечным функциям. Например, Scilab, Euler Math Toolbox и Octave.
События
Несколько раз в год фирма «Софтлайн» проводит семинары, посвященные новым версиям и отдельным подсистемам Matlab. Проводится Всероссийская научная конференция «Проектирование научных и инженерных приложений в среде MATLAB».
Смотри также
- MVR Composer — система порождения моделей нелинейной регрессии
- Автоматическая генерация документации
- Пример внешнего документирования систем
- Документирование функций Matlab
Внешние ссылки
- Matlab Webinars Лекции (голос и слайды, примерно пол-часа с возможностью перемотки) обычно состоят из введения в Matlab, решаемой задачи и рекламы. Рекомендуется к просмотру в том случае, когда нужно использовать какой-нибудь незнакомый toolbox. Можно увидеть интересный код или использование команд языка.
- Консультационный центр по Matlab
- Scilab, the open source platform for numerical computation
- Euler Math Toolbox
- Octave, high-level language for numerical computations
- Статья Matlab на Wikipedia.org, En. Смотри прочие ссылки по теме там.