Matlab
Matlab — язык программирования и система научных и инженерных расчетов, построенная на основе интерпретатора этого языка. Matlab, сокращение от «Matrix Laboratory», предназначен в первую очередь для выполнения алгоритмов, использующих векторы и матрицы.
Язык программирования Matlab (иногда также называется M-code) изначально был разработан с целью упрощения работы с процедурами широко распространенной в 70-80 годы библиотеки алгоритмов линейной алгебры LINPACK. Впоследствии он развился в мощный язык с богатым набором типов данных.
Оболочка Matlab состоит из командной строки, текстового редактора со встроенным отладчиком и окнами со списком файлов, списком видимых переменных и с историей введенных команд.
Matlab имеет большое число пакетов (toolboxes) — как собственных, так и распространяемых независимыми разработчиками часто на условиях открытого кода. В Matlab включен Simulink — визуальный редактор для моделирования динамических систем.
Содержание |
Краткий обзор языка Matlab
Векторы и матрицы
ввести вектор-столбец
вектор-строку
и матрицу
4 5 6]
задать матрицы
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:100]
vec = linspace(0,1,100)
соединить векторы
добавть элемент к вектору-столбцу
vec(end+1) = 3
добавить элемент в вектору-строке
векторизовать матрицу
удалить элементы
vec(idx) = []
vec=[]
соединить матрицы
mat2 = mat1(2:4,2:5)
mat2 = mat2'
mat2 = [mat1; mat1]
mat2 = [mat1, mat1]
текстовая строка - это вектор
str = ['The lucky number is ', num2str(i)]
но не наоборот
str = sprintf(' 1 plus%s %d',str,i)
Операции
скалярное произведение
norm = x'*x
table = x*x'
умножение матриц
ATA = A'*A
ATA1 = inv(ATA)
ATA1'*ATA
поэлементные операции
y = x+x
y = x.*x
Y = A.*A
Типы данных
структура
PP.tolX = 10e-6;
PP.display = 1;
niter = PP(1).niter;
PP
массив ячеек
strarray = {'north','south';'west','east'}
fprintf(1, 'Go to the %s!\n', strarray{1,1});
возвращает ячейку
возвращает содержимое
Цикл
цикл for
for i=1:length(x)
fprintf(1,'%1.2f\n',x(i)); % some code uses x(i)
end
итератор может быть элементом вектора
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
или вектором-столбцом матрицы
for i = mat % no need to use additional lines if you deal with vectors
fprintf(1,'i'' = %s\n',num2str(i'));
end
см. также
Условный переход
оператор if использует как логические так и целочисленные переменные; можно использовать операции 'and(a, b)', синоним 'a && b' и 'or(a, b)', синоноим 'a || b'
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
но удобнее использовать
disp('something remarkeble happens')
end
Эффективное программирование
Matlab в своих базовых конструкциях сложнее C/C++, поэтому желательно смотреть чужой код с целью выявления удачных приемов
пример 1, строим усеченную синусоиду, вариант 1
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
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
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
x = rand(n,1);
A = magic(n);
A = A*diag(x); % much better
Функции
функции бывают embedded, private, public, inline, см. doc; при написании желательно организовать код так, чтобы функция возвращала корректный результат независимо от того, что было подано в качестве аргумента — скаляр, вектор или матрица
пример, стандартизация вектора
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)
функции могут включать варьируемое число входных и выходных аргументов
if nargin < 2, d = 1; end
% some code..., i.e.
a = c;
if nargout > 1, b = d; end
return
выполнение функций как текстовых строк в теле программы
[m,n] = eval('size(x)')
mat = feval('rand',2,2)
пример, как сделать случайную k-индексную матрицу
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
y1 = f1([1 2],3)
y1 = f1([1,2],[1:5]') % be care of this; use .-operations
пример 2
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. Смотри прочие ссылки по теме там.