Matlab

Материал из SRNS
Перейти к: навигация, поиск

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])

Рекомендации программистам

  1. Matlab прост в освоении. Нет понятий проект, компилятор, библиотека.
  2. Есть командная строка, редактор m-code, path list и help.
  3. Если вы ходите использовать функцию из toolbox просто используйте ее имя в коде.
  4. Коллизий имен не существует. Старое имя исчезает при его перезагрузке.
  5. Функции вызываются по имени согласно path list (см. основное меню). Следите на очередностью в этом списке.
  6. Почитайте help, если вам нужно написать известный алгоритм, возможно он уже написан.
  7. В частности, функции, работающие с множествами: intersect, ismember, issorted, setdiff, setxor, union, unique и очень полезная функция is* находятся в Help navigator -> MATLAB -> Functions — Categorical list.
  8. Wikipedia.org содержит много библиотек для Matlab.
  9. Не нужно избегать сложных алгоритмов. Часто задачи классификации, регрессии, оптимизации решаются в одну строку кода.
  10. Желательно документировать свои функции так:
    • первая строка — назначение функции
    • вторая строка — имя функции и ее входные и выходные аргументы
    • варианты использования функции
    • пример использования функции
  11. Изучите все структуры данных в Matlab, их очень много. В последней версии (R2008a) появилась поддержка работы с классами.
  12. Избегайте циклов, если возможно, используйте операции работы с матрицами.
  13. Имеется возможность подключать функции, написанные на C (в виде специально скомпилированных библиотек).

Некоммерческие версии

Matlab — коммерческая программа. Существуют некоммерческие варианты, совместимые по базовым конструкциям языка, но не совместимые по библиотечным функциям. Например, Scilab, Euler Math Toolbox и Octave.

События

Несколько раз в год фирма «Софтлайн» проводит семинары, посвященные новым версиям и отдельным подсистемам Matlab. Проводится Всероссийская научная конференция «Проектирование научных и инженерных приложений в среде MATLAB».

Смотри также

Внешние ссылки