• Nenhum resultado encontrado

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
36
0
0

Texto

(1)

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

snt@di.fct.unl.pt

jfs@di.fct.unl.pt

(2)

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.

(3)

MATLAB the Language of Technical Computing

Simulink for Model-based and System-Level Design

Site para consulta da linguagem:

(4)

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

(5)
(6)

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)

Double e.g., 3.2567 (8 bytes)

(7)

Uint8 e Doubles

•  Double

– Maioria funções MATLAB

•  doubles como argumento de entrada

•  return double

(8)

Uint8 e Doubles

>> a=1:5 a = 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.5 ans = 2.5000 5.0000 7.5000 10.0000 12.5000 >> b*2.5 ans = 3 5 8 10 13 >> c*2.5 ans = 2.5000 5.0000 7.5000 10.0000 12.5000

(9)

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

(10)

Tipo de Dados ‘Char

c = hello >> d=[c,‘ again'] d = hello again >> b=['hello';'again'] b = hello again >> size(b) ans = 2 5

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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,

(16)

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

(17)

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

(18)

Controlo de Fluxo

•  If, else, endif

– if index<100

statements

else

statements

end

•  For…..

– For i = 1:100

statements

end

•  Switch, while

(19)

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

(20)

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

•  %

(21)

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

(22)

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'); tic % iniciar o timer

for i=1:n

y(i) = rand(1);

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

…...

(1) Calcula n n. aleatórios

e correspondente soma usando loop for; (2) Calcular tempo execução;

(23)

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;

(24)

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.

(25)

Exemplo de função MATLAB

function [meanr, stdr, z] = simulate(n);

Identificador de função

Lista de valores de output devolvidos

Nome da função

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

(26)

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

(27)

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

(28)

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

(29)

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

(30)

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 =

(31)

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');

(32)

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

(33)

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

(34)

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

(35)

Exercícios

1- Fazer uma função que receba como entrada

um vector e devolva outro vector correspondente

à normalização do primeiro.

(36)

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.

Referências

Documentos relacionados

Resumo – Este trabalho apresenta o desenvolvimento e a realização de um controlador digital (unificado) baseado em FPGA para controle e estudo de inversores de potência para suportar

isolinhas A5547 (soja não Bt) e MON 87701 x MON 89788 seja isolinhas, o processo de transgenia pode alterar a composição química da planta, e consequentemente os voláteis

Para n˜ao ter que digitar nova- mente comandos executados anteriormente clique para cima na com- mand window;... 10 criando

Neste mesmo dia, iniciamos as atividades com uma Contação de Histórias: A Galinha Ruiva, realizamos um momento de conversação: sobre a importância da cooperação de todos para que

O ultra-som teve um efeito positivo no processo de secagem mais curto, mas um efeito negativo significativo como o aumento no tempo de processamento, levando a

A coordenação das atividades de extensão a serem desenvolvidas pelos alunos será realizada por docente da Fundação Santo André – Coordenação de Inglês, com as

Esta função mostra na tela a mensagem de texto e aguarda que o usuário digite um texto (string) que será armazenado (mas não alvaliado) na variável R.. Isto permite uma

Formatação dos números apresentados – comando format Muda o formato de apresentação dos números, para ponto fixo, ponto flutuante, hexadecimal, monetário e hexadecimal. &gt;&gt; x