Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data...

36
Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva Departamento de Informática snt @ di . fct . unl .pt [email protected]

Transcript of Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data...

Page 1: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Breve Introdução à Programação em MATLAB

Aulas Práticas de Aprendizagem Automática & Data Mining

Ano Lectivo 2007/2008

Susana Nascimento

Joaquim F. Silva

Departamento de Informática

[email protected]

[email protected]

Page 2: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Introdução ao MatLabO 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.

Page 3: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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

Page 4: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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

Page 5: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.
Page 6: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Tipos de Dados em MatLab

Array

Char Numeric Structure Cell‘a’ image.width = 120

image.name = ‘face1’

Uint8(8 bit unsigned integer, from 0 to 255,e.g., image gray scales)

Doublee.g., 3.2567(8 bytes)

Page 7: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Uint8 e Doubles

• Double– Maioria funções MATLAB

• doubles como argumento de entrada• return double

Page 8: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Uint8 e Doubles>> a=1:5a = 1 2 3 4 5

>> b=uint8(a)b = 1 2 3 4 5

>> c=double(b)c = 1 2 3 4 5

>> a*2.5ans = 2.5000 5.0000 7.5000 10.0000 12.5000

>> b*2.5ans = 3 5 8 10 13

>> c*2.5ans = 2.5000 5.0000 7.5000 10.0000 12.5000

Page 9: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Tipo ‘Char’>> c=['hello'];>> whos Name Size Bytes Class Attributes

a 1x5 40 double ans 1x5 40 double b 1x5 5 uint8 c 1x5 10 char

>> c(1)

ans =

h

>>

Page 10: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Tipo de Dados ‘Char’c =hello

>> d=[c,‘ again']d =hello again

>> b=['hello';'again']b =helloagain

>> size(b)ans =2 5

Page 11: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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 1x1 130 struct image 1x1 590 struct

>> clear ima>> whos Name Size Bytes Class Attributes

image 1x1 590 struct

>>

Page 12: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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 Attributes image 1x2 870 struct

>> image

image =

1x2 struct array with fields: name height width data

Page 13: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Arrays de Estruturas>> image(2)

ans =

name: 'Mary' height: 4 width: 4 data: []

>> image(1)

ans =

name: 'Tom' height: 3 width: 3 data: [3x3 double]

>>

>> 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 Attributes image 1x2 870 struct

>> image

image =

1x2 struct array with fields: name height width data

Page 14: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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)

Page 15: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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 matrizesde 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

Page 16: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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.*bans =

8 15

» b/2ans = 2.0000 2.5000

Page 17: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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

» aa = 2 3

» bb = 4 5

» a > bans = 0 0

» b > aans = 1 1

» a > 2ans = 0 1

Page 18: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Controlo de Fluxo

• If, else, endif– if index<100

statementselse statementsend

• For…..– For i = 1:100

statementsend

• Switch, while

Page 19: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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 returnados 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

Page 20: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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.• %• %•

Page 21: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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

Page 22: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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 yfprintf('Simulando %d números aleatórios.....\n\n',n);

% primeiro fazer os cálculos no “loop for"fprintf('For loop calculations.....\n');tic % iniciar o timer for i=1:n y(i) = rand(1);endtotal = 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);

…...

(1) Calcula n n. aleatóriose correspondente soma usando loop for; (2) Calcular tempo execução; (3) mostrar resultado

Page 23: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Exemplo de Script MATLAB

…………% agora calculando através da vectorizaçãofprintf('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óriose correspondente soma usando função rand; (2) Calcular tempo execução; (3) mostrar resultado

Page 24: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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.

Page 25: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Exemplo de função MATLABfunction [meanr, stdr, z] = simulate(n);

Identificador de função

Lista de valores de output devolvidos

Nome dafunção

Lista de argumentos de entrada,(separados por vírgula)

Page 26: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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

Page 27: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Exemplo de função MATLABfunction [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

Page 28: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Exemplo de função MATLABfunction [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 positivoif (rem(n,1)~=0) | n<=0 error('Input n deve ser inteiro positivo');end

Validar condições com mensagens erro

Page 29: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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óriosz = rand(n,1);

% calcula a média e o desvio padrãomeanr= 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ícitaValores não devolvidos são locais à função

Page 30: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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.493962Desvio 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.500110Desvio padrão dos 200000 números aleatórios = 0.288374

x = 0.5001

y = 0.2884

Page 31: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Outra Função MATLABfunction [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

Page 32: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Simplot.m (cont.)

% generate the n random numbersz = rand(n,1);

% calculate the mean and standard deviationmeanr= 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.)

Page 33: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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

Page 34: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

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

Page 35: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Exercícios1- Fazer uma função que receba como entrada um vector e devolva outro vector correspondente à normalização do primeiro.

nxxxX ,, 21 nzzzZ ,, 21

)var(X

xxz ii

ni

ii xx

nX

1

2)(1

1)var(

ni

iixn

x1

1

Page 36: Breve Introdução à Programação em MATLAB Aulas Práticas de Aprendizagem Automática & Data Mining Ano Lectivo 2007/2008 Susana Nascimento Joaquim F. Silva.

Exercícios2- 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.