Breve Introdução à
Programação em MATLAB
Aulas Práticas de Aprendizagem Automática
Ano Lectivo 2006/2007
Susana Nascimento
Joaquim F. Silva
Departamento de Informática
[email protected]
[email protected]
Introdução ao MatLab
O ambiente de trabalho das aulas práticas: MATLAB.
O MATLAB é um ambiente de programação de alto nível para
aplicações científicas e de engenharia.
Facilidades
 Oferece um leque alargado de bibliotecas de funções pré-definidas.
 Muito amigável em funcionalidades gráficas para visualização de
dados.
 Largamente divulgado em universidades e laboratórios de
investigação.
 Muito conveniente para o desenvolvimento eficáz de protótipos.
MATLAB the Language of Technical Computing
Simulink for Model-based
and System-Level Design
Site para consulta da linguagem:
http://www.mathworks.com/access/helpdesk/help/techdoc/learn_matlab/learn_matlab.shtml
Sumário
• Tipos de dados
– arrays: caracteres, numéricos, estruturados, …
• Operadores
– aritmética, relacionais, lógicos.
• Fluxo de Controlo
– condicionais, case, while, etc.
• M-functions
– sintaxe
– Exemplos e funções simples
Tipos de Dados em MatLab
Array
Char
‘a’
Numeric
Uint8
(8 bit unsigned integer,
from 0 to 255,
e.g., image gray scales)
Structure
image.width = 120
image.name = ‘face1’
Double
e.g., 3.2567
(8 bytes)
Cell
Uint8 e Doubles
• Double
– Maioria funções MATLAB
• doubles como argumento de entrada
• return double
Uint8 e Doubles
>> a=1:5
a=
1 2
3
4
>> b=uint8(a)
b=
1 2 3 4
5
5
>> c=double(b)
c=
1 2 3 4
5
>> a*2.5
ans =
2.5000
7.5000 10.0000 12.5000
5.0000
>> b*2.5
ans =
3 5 8 10 13
>> c*2.5
ans =
2.5000
5.0000
7.5000 10.0000 12.5000
Tipo ‘Char’
>> c=['hello'];
>> whos
Name
Size
a
ans
b
c
>> c(1)
ans =
h
>>
1x5
1x5
1x5
1x5
Bytes Class
40 double
40 double
5 uint8
10 char
Attributes
Tipo de Dados ‘Char’
c=
hello
>> d=[c,‘ again']
d=
hello again
>> b=['hello';'again']
b=
hello
again
>> size(b)
ans =
2 5
Tipo de Dados ‘Struct’
>> image.height=3;
>> image.width=3;
>> image.data = [8 10 2; 22 7 22; 2 4 7];
>> whos
Name
Size
Bytes Class Attributes
ima
image
1x1
1x1
>> clear ima
>> whos
Name
Size
image
>>
1x1
130 struct
590 struct
Bytes Class
590 struct
Attributes
Arrays de Estruturas
>> image.name='Tom';
>> image.height=3;
>> image.width=3;
>> image.data=[8 10 2; 22 7 22; 2 4 7];
>> image(1)=image;
>> image(2).name='Mary';
>> image(2).height=4;
>> image(2).width=4;
>> whos
Name
Size
Bytes Class
image
1x2
870 struct
>> image
image =
1x2 struct array with fields:
name
height
width
data
Attributes
Arrays de Estruturas
>> image(2)
>> image.name='Tom';
>> image.height=3;
>> image.width=3;
>> image.data=[8 10 2; 22 7 22; 2 4 7];
>> image(1)=image;
>> image(2).name='Mary';
>> image(2).height=4;
>> image(2).width=4;
>> whos
Name
Size
Bytes Class
image
1x2
870 struct
>> image
image =
1x2 struct array with fields:
name
height
width
data
ans =
name: 'Mary'
height: 4
width: 4
data: []
Attributes
>> image(1)
ans =
name: 'Tom'
height: 3
width: 3
data: [3x3 double]
>>
Operadores
• Aritméticos
– Computação numérica, e.g., 2^10
• Relacional
– Comparação quantitativa de operandos
– e.g., a < b
• Lógico
– AND, OR, NOT
– Devolve variável Booleana, 1 (TRUE) ou 0 (FALSE)
Operadores Aritméticos
• Transposta, a’
• Potência, a^2
• Adição, multiplicação, divisão
– a(1)*b(2)
– a*b
• Aplica-se se a e b forem matrizes
de dimensões compatíveis
(columns(a) = rows(b))
– a.*b (elemento a elemento)
• Excepto para operações com matrizes, a maioria dos
operandos devem ser do mesmo tamanho,
a menos que um seja um escalar
Operadores Aritméticos
• Transposta, a’
• Potência, a^2
• Adição, multiplicação, divisão
– a(1)*b(2)
– a*b
• Aplica-se se a e b forem matrizes
de dimensões compatíveis
(columns(a) = rows(b))
– a.*b (elemento a elemento)
excepto para operações com
matrizes, os operandos devem
ser do mesmo tamanho, a menos que
um seja escalar
» a = [2 3];
» b = [4 5];
» a(1)*b(2)
ans =
10
» a*b
??? Error using ==> *
Inner matrix dimensions must agree.
» a*b'
ans =
23
» a.*b
ans =
8
15
» b/2
ans =
2.0000
2.5000
Operadores Relacionais
• <, <=, >, >=, ==, ~=
• Compara elementos correspondentes de
arrays das mesmas dimensões
• Se um é escalar e o outro não,
o escalar é comparado com cada elemento
• O resultado é 0 ou 1, elemento a elemento
»a
a=
2
3
»b
b=
4
5
»a>b
ans =
0 0
»b>a
ans =
1 1
»a>2
ans =
0 1
Controlo de Fluxo
• If, else, endif
– if index<100
statements
else
statements
end
• For…..
– For i = 1:100
statements
end
• Switch, while
Programação em MATLAB
• Ficheiros com código MATLAB: “M file”, e.g.,
sort.m
• Dois tipos de M-files
– scripts
• Não há variáveis de entrada
• Não são retornados valores
• Operam os dados na workspace
– funções
• Podem aceitar argumentos e retornar valores
• Por default as variáveis são locais
• Funcionalidade do Matlab aumentada pela utilização de
funções
Exemplo de Script MATLAB
• • • • • • • % script randVect
% Script simples para gerar um vector de n n. aleatórios.
% ilustar aplicando:
% (a) loops for, and (b) chamada directa a uma função.
%
%
Exemplo de Script MATLAB
• • • • • • % script randVect
% Script simples para gerar um vector de n n. aleatórios.
% ilustar aplicando:
% (a) loops for, and (b) chamada directa a uma função.
%
%
• n = 100000; % the number of points for the "for loop”
• y = zeros(n,1); % preallocate memory for y
• fprintf('Simulating %d random numbers.....\n\n',n);
• Inicialização de variáveis
Print de informação para o ecran
Exemplo de Script MATLAB
% script randVect
% Script simples para gerar um vector de n n. aleatórios.
% ilustar aplicando:
%
(a) loops for, and (b) chamada directa a uma função.
n = 100000;
% número de elementos do vector (iterações do “loop for”)
y = zeros(n,1);
% prealoca memória para o vector y
fprintf('Simulando %d números aleatórios.....\n\n',n);
% primeiro fazer os cálculos no “loop for"
fprintf('For loop calculations.....\n');
(1) Calcula n n. aleatórios
tic % iniciar o timer
e correspondente soma usando loop for;
for i=1:n
(2) Calcular tempo execução;
y(i) = rand(1);
(3) mostrar resultado
end
total = sum(y);
fprintf('Sum of %d random numbers = %f\n',n,total);
t1 = toc;
% ler o tempo que passou desde o “tic” (em segundos)
fprintf('Tempo gasto, no loop = %6.5f microseconds\n\n', (t1)*1000);
…...
Exemplo de Script MATLAB
………
…
% agora calculando através da vectorização
fprintf('Vectorization calculations.....\n');
tic % iniciar o timer
z = rand(n,1);
total = sum(z);
fprintf('Soma dos %d números aleatórios = %f\n',n,total);
t2 = toc;
% ler o tempo gasto desde o “tic” (em segundos)
fprintf(‘Tempo gasto = %6.5f microsegundos\n', (t2)*1000);
(1) Calcula n n. aleatórios
e correspondente soma usando função rand;
(2) Calcular tempo execução;
(3) mostrar resultado
Gerador de números (pseudo)
aleatórios em MatLab
• Gera sequência (de comprimento n) de nºs pseudo aleatórios:
– Geração da sequência: x(i) = mod(a * x(i-1), m)
– Inicialização com valor (“seed”)
» help rand
RAND Uniformly distributed random numbers.
RAND produces pseudo-random numbers. The sequence of numbers
generated is determined by the state of the generator. Since MATLAB
resets the state at start-up, the sequence of numbers generated will
be the same unless the state is changed.
S = RAND('state') is a 35-element vector containing the current state
of the uniform generator. RAND('state',S) resets the state to S.
RAND('state',0) resets the generator to its initial state.
RAND('state',J), for integer J, resets the generator to its J-th state.
RAND('state',sum(100*clock)) resets it to a different state each time.
This generator can generate all the floating point numbers in the
closed interval [2^(-53), 1-2^(-53)]. Theoretically, it can generate
over 2^1492 values before repeating itself.
Exemplo de função MATLAB
function [meanr, stdr, z] = simulate(n);
Identificador de função
Lista de valores de output devolvidos
Lista de argumentos de entrada,
(separados por vírgula)
Nome da
função
Função MATLAB
• Definição de linha de função
– Requerida em todas as funções
• Lista de inputs e outputs
– vírgula separadora: [y, z] = average(a, b, c)
– Para mais do que um output, os outputs são limitados por
parêntesis rectos
• Variáveis de entrada
– Variáveis de função são locais à função
– As variáveis de entrada são legíveis pela função: cópias
locais podem ser feitas se precisarmos de mudar os inputs
• Escopo
– MATLAB procura seguindo a ordem:
• nome da variável, subfunção, directoria corrente e
search path do MATLAB
Exemplo de função MATLAB
function [meanr, stdr, z] = simulate(n);
%
% Função que calcula e devolve: média e desvio padrão dos números aleatórios
% (distribuição uniforme)
%
% INPUTS:
%
n: number (inteiro) de nºs (pseudo)aleatórios a gerar.
%
% OUTPUTS:
%
meanr: média dos n nºs (pseudo)aleatórios
%
stdr: desvio padrão dos nºs (pseudo)aleatórios
%
z:
array n x 1 de nºs (pseudo)aleatórios
Funções comentadas
Exemplo de função MATLAB
function [meanr, stdr, z] = simulate(n);
%
% Função que calcula e devolve: média e desvio padrão dos números aleatórios
% (distribuição uniforme)
%
% INPUTS:
%
n: number (inteiro) de nºs (pseudo)aleatórios a gerar.
%
% OUTPUTS:
%
meanr: média dos n nºs (pseudo)aleatórios
%
stdr: desvio padrão dos nºs (pseudo)aleatórios
%
z:
array n x 1 de nºs (pseudo)aleatórios
% testa se n é inteiro positivo
if (rem(n,1)~=0) | n<=0
error('Input n deve ser inteiro positivo');
end
Validar condições com mensagens erro
Exemplo de função MATLAB
…
fprintf(‘Calcula Média e desvio padrão de %d números aleatórios.....\n\n',n);
% gera n números aleatórios
z = rand(n,1);
% calcula a média e o desvio padrão
meanr= mean(z);
fprintf('Média dos %d números aleatórios = %f\n',n,meanr);
stdr= std(z);
fprintf(‘Desvio padrão dos %d números aleatórios = %f\n',n,stdr);
Não necessita de função return explícita
Valores não devolvidos são locais à função
Chamada da função MATLAB
>> [x,y]=simulate(200)
Calcula média e desvio padrão de 200 números aleatórios.....
Média dos 200 números aleatórios = 0.493962
Desvio padrão dos 200 números aleatórios = 0.282144
x=
0.4940
y=
0.2821
>> [x,y]=simulate(200000)
Calcula média e desvio padrão de 200000 números aleatórios.....
Média dos 200000 números aleatórios = 0.500110
Desvio padrão dos 200000 números aleatórios = 0.288374
x=
0.5001
y=
0.2884
Outra Função MATLAB
function [meanr, stdr, z] = simplot(n,plotflag);
%
% Função que, relativamente a um vector de n valores uniformemente
%distribuidos calcula e devolve: média e desvio padrão dos números. Se
% var plotflag for 1 é feito o plotting do histograma dos nºs gerados.
%
% INPUTS:
%
n: number (inteiro) de nºs (pseudo)aleatórios a gerar.
%
plotflag: se plotflag=1, desenhar histograma de z,
%
c.c. não.
%
% OUTPUTS:
%
meanr: média dos n nºs (pseudo)aleatórios
%
stdr: desvio padrão dos nºs (pseudo)aleatórios
%
z:
array n x 1 de nºs (pseudo)aleatórios
% testa se n é inteiro positivo
if (rem(n,1)~=0) | n<=0
error('Input n deve ser inteiro positivo');
end
Simplot.m (cont.)
% generate the n random numbers
z = rand(n,1);
% calculate the mean and standard deviation
meanr= mean(z);
fprintf('Média de %d números aleatórios = %f\n',n,meanr);
stdr= std(z);
fprintf(‘desvio padrão dos %d números aleatórios = %f\n',n,stdr);
if nargin>1 & plotflag==1
figure
hist(z, max(n/100,10))
end
Novo código
Nargin n. de argumentos de entrada
sintaxe: hist(data vector, número de interv.)
Fazer o plotting da média amostral em
função de n
• Alteração do simplot.m
– Para cada valor i = 1 … n, calcular
• mean(i) = [sum (x(i)…… x(i)) ]/I
• mean(i) deve convergir para true mean 0.5 para
n>>>
– “Lei dos grandes números” da estatística
– Fazer plot para visualizar
– Características de plotting acrescidas
• grids, log axes, labels, titles
Código acrescentado ao
simplot.m
if nargin>1 & plotflag==1
figure % figure para ver quão uniforme é a distribuição
hist(z,max(n/100,10))
figure % figure para ver como a amostra converge para 0.5
cs = cumsum(z);
% gera um vector de somas cacumuladas
ns = 1:n;
% gera um vector de tamanhos de amostras
runningmean = cs’./ns;
% calcula as médias (running mean)
plot(ns,runningmean);
%runningmean = cs./ns';
%semilogx(ns,runningmean);
%grid;
%axis([1 n 0 1]);
%xlabel('Numero de números aleatórios gerados');
%ylabel(‘Valor da média');
%title('Convergência da média da amostra para a média verdadeira');
end
Exercícios
1- Fazer uma função que receba como entrada
um vector e devolva outro vector correspondente
à normalização do primeiro.
Exercícios
2- Fazer uma função que, a partir de uma matriz
de N objectos e A atributos caracterizadores,
devolva a matriz de correlações entre os
atributos.
Download

IntroMatLab