Curso de MATLAB%c2%ae

113
Núcleo de Engenharia Bioméd ica do IST Setembro/Outubro 2008 Responsável: Gustavo Lopes

Transcript of Curso de MATLAB%c2%ae

Page 1: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 1/113

 

Núcleo de Engenharia Biomédica do IST

Setembro/Outubro 2008

Responsável: Gustavo Lopes

Page 2: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 2/113

 

Noções gerais sobre o MATLAB e o seu interface gráfico

Page 3: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 3/113

 

O MATLAB Nome vem de matrix laboratory 

Programa de computador optimizado para cálculoscientíficos e de engenharia

Implementa a linguagem de programação do MATLAB

Page 4: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 4/113

 

Vantagens Fácil de usar, muito prático para prototipagens

Suportado em diversas plataformas (Linux, Windows,Solaris e Mac OS X)

Elevado número de funções predefinidas

Excelente para visualizar dados técnicos

Integração com outras linguagens (especialmente Java)

Page 5: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 5/113

 

Desvantagens Preço

 Vários milhares de euros Mas: USD 89 para a versão de estudantes (R2007a) Mas: CIIST disponibiliza licenças validadas em rede

Última versão: R2008a  Várias toolboxes  Ver https://delta.ist.utl.pt/software/matlab.php

(tarball em https://nebm.ist.utl.pt/~glopes/MATLAB/ )

Mais lento que código escrito em C/C++ Especialmente em código não vectorizado

Page 6: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 6/113

 

Desktop do MATLAB

Page 7: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 7/113

Janela de comandos Permite executar

comandosinteractivamente

Executar mais que umcomando de uma vez:

Usar vírgula ouquebra de linha(shift+enter)

Usar ponto e vírgula

 

Page 8: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 8/113

Directório de trabalho

Mostrado o conteúdo na janela “Current Directory ”

Primeiro local de procura de funções Sobrepõe-se ao path

Local de escrita/leitura para caminhos não totalmentequalificados

 

Page 9: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 9/113

Workspace Colecção de todas as

 variáveis em memória Variáveis podem ser

eliminadas/copiadas/guardadas/carregadasinteractivamente pela janela Workspace

who lista nomes de variáveis whos lista variáveis com

mais informação (e.g.dimensões, bytes ocupados)

 

Page 10: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 10/113

Documentação help <função> mostra a documentação de uma

função particular

help / mostra informação sobre os operadores

doc <função> mostra a documentação de umafunção ou tópico na janela de ajuda

lookfor <tópico> procura determinado termo nadescrição de uma função

 

Page 11: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 11/113

Tipos de dados Todas as variáveis são

arrays

 Arrays lógicos ou dedoubles podem seresparsos

O MATLAB temtipagem fraca (weaklytyped )

 

Page 12: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 12/113

Criação, acesso, alteração e operações lógicas

 

Page 13: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 13/113

Arrays (1) São rectangulares

Tamanho mínimo é 0 por 0 (array vazio)

Pode ter qualquer número de dimensões (tensor de qualquerordem)

size devolve o tamanho (número de graus de liberdade) de cadadimensão

 A matriz é o array mais básico O MATLAB não admite arrays unidimensionais, apenas vectores

linha e vectores coluna

 

Page 14: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 14/113

Arrays (2)Forma inválida Forma rectangular

 

Page 15: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 15/113

Criação de matrizes Matriz: array de duas dimensões

Criada com parênteses rectos []

Elementos das colunas separados por vírgula ou espaço Linhas separadas por ; (ponto e vírgula)

Exemplo (matriz 2 por 4): mat = [4 1 8 4; 6 9 1 2] ou

mat = [4, 1, 8, 4; 6, 9, 1, 2]

mat =

4 1 8 46 9 1 2

 

Page 16: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 16/113

Criação de matrizes (2) Por omissão, os arrays são criados com tipo double

Conversão pode ser feita usando as funções com o mesmonome dos tipos

Funções especializadas: ones(n) ou ones(m, n) – array de 1’s

zeros(n) ou zeros(m, n) – array de 0’s

eye(n) ou eye(m, n) – 1’s na diagonal, 0’s no resto rand(n) ou rand(m, n) – números aleatórios com

distribuição uniforme entre 0 e 1 randn(n) ou randn(m, n) – números aleatórios com

distribuição normal padrão

 

Page 17: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 17/113

Criação de matrizes (3) Matrizes podem ser criadas por

concatenação de outrasmatrizes

 A concatenação pode ser vertical,horizontal ou mista

 Além da sintaxe à direita, pode

usar-se vertcat e horzcat cat permite concatenação

segundo uma direcção arbitrária

>> [[1,2;3,4];[5,6]]

ans =

1 23 45 6

>> [[1,2;3,4],[5;6]]

ans =

1 2 53 4 6

 

Page 18: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 18/113

Criação de matrizes (4)>> mat1 = [1 2; 3 4];>> mat2 = [5 6; 7 8];>> mat3 = [9 10 11 12];>> [mat1 mat2; mat3]

ans =

1 2 5 63 4 7 89 10 11 12

>> cat(1, mat1, mat2)

ans =

1 23 45 67 8

>> cat(2, mat1, mat2)

ans =

1 2 5 6

3 4 7 8

>> cat(3, mat1, mat2)

ans(:,:,1) =

1 23 4

ans(:,:,2) =

5 67 8

 

Page 19: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 19/113

Vectores Matrizes (arrays bidimensionais) em que o tamanho de

uma das dimensões é unitário isvector testa se um array é um vector

 Vectores linha podem ser criados com início:final (passo1) e início:passo:final

 Vectores coluna podem ser criados transpondo vectoreslinha (operador .’)

>> 1:4, 0:1/3:1

ans =1 2 3 4

ans =

0 0.3333 0.6667 1.0000

>> (1:4).'

ans =

123

Page 20: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 20/113

► Exercícios Cria a matriz mat = [3 3 3 3; 4 3 3 3; 5 5 5 5]

concatenando os blocos: 3 * ones(2,3)

[5 5 5]

(3:5).’

Repete o exercício anterior recorrendo somente à

função cat para executar a concatenação Que está errado na seguinte expressão?

cat(1, [3 4 5; 5 4 3], [7 6])

 

Page 21: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 21/113

Acesso a elementos Faz-se na forma variável(índices 1, índices 2, …)

 Índices começam em 1, não em 0 como na maioria daslinguagens de programação

 Acesso linear variável(índice único)

Funciona para arrays de qualquer dimensão Devolve uma matriz linha

variável(:) lineariza qualquer array 

 

Page 22: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 22/113

Acesso a elementos (2)>> mat = [1 2 3 ; 4 5 6; 7 8 9]

mat =

1 2 34 5 67 8 9

>> mat(3)

ans =

7

>> mat(1:5)

ans =

1 4 7 2 5

 A ordem é column major order

 

Page 23: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 23/113

Acesso a elementos (3) Acesso não linear

Deve ter tantos conjuntos de índices quanto números dedimensões

Conjuntos de índices separados por vírgula

end representa o valor máximo do índice da dimensãoem que aparece (i.e., o tamanho da mesma)

Dois pontos,:

, seleccionam a respectiva dimensão emtoda a largura (equivalente a 1:end)

Se o último conjunto de índices for escalar, elimina-seúltima dimensão (excepto tratando-se já duma matriz)

 

Page 24: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 24/113

Acesso a elementos (4)>> mat = [5 3 2 6; 4 8 65; 1 5 7 3]

mat =

5 3 2 64 8 6 51 5 7 3

>> mat(3, 2)

ans =

5

>> mat([1 2], [2 4])

ans =

3 68 5

>> mat(2, :)

ans =

4 8 6 5

>> mat(2:end, [1 3])

ans =

4 61 7

 

Page 25: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 25/113

► Exercícios Dada a matrix mat = [3 3 3 3; 4 3 3 3; 5 5 5 5]

Extrai a submatriz de mat sem a primeira linha. Resolve oexercício: Seleccionando explicitamente os índices de interesse Recorrendo a um vector construído com end para as linhas e

recorrendo a : para as colunas

Extrai a submatriz de mat sem as colunas do meio. Obtém, de mat, o vector [3 3 3 3 4 3 3 3] recorrendo apenas

a acesso linear e a transposição Seleccionando submatrizes de mat e recorrendo a

concatenação, substitui a linha central por [3 3 5 5]

 

Page 26: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 26/113

Atribuição a parte de array O conteúdo de uma variável é completamente

substituído por uma atribuição com o nome da variávelno lado esquerdo (lhs) Exemplo: mat = [1 2; 3 4]

Podem substituir-se apenas alguns elementos Usa-se indexação do mesmo modo com que se

extrairiam os elementos

Se o lado direito for: Um escalar, todos os elementos referidos tomam esse valor Um array com as mesmas dimensões que a expressão do lado

esquerdo, então cada elemento referido no lado esquerdoassume o valor correspondente do lado direito

 

Page 27: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 27/113

Atribuição a parte de array (2)>> mat = zeros(3);>> mat([1 3],[1 3]) = 1;

mat =

1 0 10 0 01 0 1

>> mat = zeros(3);

>> mat(1:2,2:3) = [1 2; 3 4]

mat =

0 1 20 3 4

0 0 0

>> mat = zeros(3);>> mat(1:5) = 10:14

mat =

10 13 011 14 012 0 0

>> mat = zeros(3);

>> mat(1:5) = 10:16??? In an assignment A(I)= B, the number of elementsin B and I must be the same.

 

Page 28: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 28/113

Atribuição a parte de array (3) As atribuições a arrays podem referenciar do lado

esquerdo:  Índices superiores ao tamanho da respectiva

dimensão, aumentando o tamanho dessa dimensão São colocados zeros em todos os elementos que não são alvo

da atribuição e que não estavam antes definidos

Mais um índice do que o número de dimensões,

adicionando mais uma dimensão ao array  O lado direito tem de ter mesmos tamanhos que o esquerdo

Forma alternativa à concatenação de criar arrays de dimensãosuperior a 2

 

Page 29: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 29/113

Atribuição a parte de array (4) Índices superiores Mais dimensões

>> mat = ones(2);>> mat(4:5, 3) = [1; 2]

mat =

1 1 01 1 00 0 0

0 0 10 0 2

>> mat = 2*ones(2);>> mat(:, :, 2) = 3*ones(2)

mat(:,:,1) =

2 22 2

mat(:,:,2) =

3 33 3

 

Page 30: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 30/113

► Exercícios Seja mat = [8 1 6; 3 5 7; 4 9 2]

Substitui a linha do meio por zeros

Usando uma única atribuição, adiciona uma 4ª coluna a mat

com a soma dos valores das linhas (e.g. mat(1, 4) deve valer8+1+6=15). Nota: usa a função sum(mat, 2) para fazer estasoma ao longo das colunas (dimensão 2).

Desloca os valores de mat uma coluna para a direita e uma

linha para baixo tal que a matriz passe a ser 4 por 4. A primeira linha e a primeira coluna devem ficar apenas comzeros. Usa três atribuições a mat.

Tenta executar mat(2, :) = []. Que resultado observas?

 

Page 31: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 31/113

Arrays lógicos (1) O valor de verdade é representado por 1; falso é

representado por 0

>> true

ans =

1

>> false

ans =

0

>> 5 > 6

ans =

0

>> 6 ~= 7

ans =

1

 

Page 32: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 32/113

Arrays lógicos (2) Operadores > , <, ==, ~=, >=, <=, &, | e xor operam

elemento a elemento De um dos lados tem de estar

Ou um escalar, caso em que a operação é aplicada entre esseescalar e cada um dos elementos do array do outro lado

Ou um array com a mesma forma que aquele do outro lado,caso em que a operação é aplicada entre elementos homólogos

Para verificar igualdade entre dois arrays, usar isequal

 

Page 33: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 33/113

Arrays lógicos (3)>> mat = [1 3 5; 3 4 5];>> mat > 3

ans =

0 0 10 1 1

>> class(ans)

ans =

logical

>> mat = [1 3 5; 3 4 5];>> mat > [2 2 6; 4 3 4]

ans =

0 1 00 1 1

>> [0 1 0; 0 1 1] | [1 1 0; 0 0 1]

ans =

1 1 00 1 1

 

Page 34: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 34/113

Arrays lógicos (4)Não funciona Usar isequal

>> a = [1 2 3; 4 5 6];>> b = [1 2; 4 5];

>> a == b??? Error using ==> eqMatrix dimensions mustagree.

>> a = [1 2 3; 4 5 6];>> b = [1 2; 4 5];

>> isequal(a,b)

ans =

0

 

Page 35: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 35/113

Arrays lógicos (5)  Arrays lógicos podem ser usados como “índices” de arrays

O array lógico tem de ter a mesma forma que o array queindexa

Seleccionam os elementos correspondentes às posiçõesem que o array lógico assume o valor de verdade

É devolvido um vector coluna

 

Page 36: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 36/113

Arrays lógicos (6) Atenção que os arrays

são, por omissão, dotipo double

Pode ser necessáriofazer um conversão

explícita para o tipological

>> mat = [1 3 5; 3 4 5];>> mat([0 1 0; 1 1 0])??? Subscript indices musteither be real positive

integers or logicals.

>> mat(logical([0 1 0; 1 1 0]))

ans =

334

 

Page 37: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 37/113

Arrays lógicos (7) find(logic_mat) devolve

as posições linearizadas ondeo argumento é verdadeiro

>> mat = [1 3 5; 3 4 5];>> mat(mat > 3)

ans =

455

>> mat(mat > 3) = 0

mat =

1 3 03 0 0

>> mat = [1 3 5; 3 4 5];>> find (mat == 3)

ans =

23

>> find(mat > 3 & mat < 5)

ans =

4

 

Page 38: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 38/113

Arrays lógicos (8) [x y] = find(logic_mat)

coloca na variável x as posiçõesdas linhas e na variável y as

posições das colunas onde oargumento é verdadeiro

>> mat = [1 3 5; 3 4 5];>> [x y] = find(mat >= 3 & mat < 5)

x =

212

y =

122

 

Page 39: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 39/113

► Exercícios Seja mat uma matriz arbitrária. Como colocarias a 0 todos

os seus elementos cujo módulo fosse inferior a 10^-10?

Seja vec = [3 4 7 5 3 9 11 2]

Usando isprime, selecciona todos os números primos em vec

Usando isprime e find, selecciona a posição do 2º númeroprimo em vec

Usando isprime, xor e sum, encontra o número de elementos

de vec que satisfazem, uma, mas não ambas, das seguintescondições: Elemento primo

Elemento maior que 7

 

Page 40: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 40/113

Caracteres, células, estruturas e referências para funções

 

Page 41: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 41/113

Caracteres (1) Criados com char(array numérico) ou 'cadeia de

caracteres' (com as plicas) Primeiro método implica conhecer correspondência

entre números e caracteres (a codificação usada) O segundo método:

Cria um array 1 por n (uma string), onde n é o número decaracteres entre as plicas

 A plica pode ser incluída escapando-a com outra plica A exigência de que os arrays têm de ser rectangulares

mantém-se!

 

Page 42: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 42/113

Caracteres (2)>> 'uma plica na string:''!'

ans =

uma plica na string:'!

>> size(ans)

ans =

1 22

>> ['string 1' 'string 2']

ans =

string 1string 2

>> ['string 1'; 'string 2']

ans =

string 1

string 2

>> ['string 1'; 'string 2 ...']??? Error using ==> vertcatCAT arguments dimensions are notconsistent.

 

Page 43: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 43/113

Células (1) Arrays de MATLAB só podem ter 1 tipo de dados

 Arrays de células permitem guardar vários tipos dedados numa só variável O array continua a ter só um tipo de dados (células)

Cada célula pode contém um array arbitrário

Inclusive, uma célula pode conter um array de células

 

Page 44: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 44/113

Células (2) Criar uma célula (array de células 1 por 1): {array}>> ca = {[1 3; 2 5]}

ca =

[2x2 double]

>> ca = [ca {42}]

ca =

[2x2 double] [42]

>> [{zeros(2)} {1986};{int8(zeros(3))} {'uma string'}]

ans =

[2x2 double] [ 1986]

[3x3 int8 ] 'uma string'

 

Page 45: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 45/113

Células (3) Pode ser usado apenas o operador {}

{A B; C D} é equivalente a [{A} {B}; {C} {D}]

Ex.: {zeros(2) 1986; int8(zeros(3)) 'uma string'}

var{indíces} = A é equivalente var(índices) = {A}

Ex.: ca = {6}; ca{2} = zeros(3);

Pode seleccionar-se uma célula particular ou umsubarray de um array de células com o operador () No entanto, isto não extrai os elementos das células!

 

Page 46: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 46/113

Células (4) Extracção de elementos de dentro das células faz-se

com o operador {} O operador {} pode ser encadeado O operador () pode aparecer no final Ex.: ca = {4, {zeros(2)}}; ca{2}{1}(2,2)

Extrair mais que um elemento de cada vez resulta emretorno múltiplo! Outra solução que extraísse os elementos de dentro das

células seria impossível, já que, em geral, é impossívelcombinar os conteúdos das várias células seleccionadas

Concatenação pode ser forçada e.g. com cat

 

Page 47: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 47/113

Células (5)>> ca = {[1 3; 2 4], 'foo';zeros(2), 'bar'}

ca =

[2x2 double] 'foo'[2x2 double] 'bar'

>> ca(1,:)

ans =

[2x2 double] 'foo'

>> ca{1,2}

ans =

foo

>> [a b] = ca{1,:}

a =

1 3

2 4

b =

foo

>> cat(1, ca{:,1})

ans =

1 32 40 00 0

 

Page 48: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 48/113

►Exercícios

Constrói uma string cujo conteúdo é “O valor de var é x”, onde x é o valor do escalar guardado na variável varpelos métodos que se seguem e imprime-a na command 

window com disp(string): Usando concatenação horizontal e a função num2str

Usando a função sprintf (escreve help sprintf)

Por que razão são, em geral, arrays de células maisadequados do que matrizes de caracteres para guardarconjuntos de strings?

 

Page 49: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 49/113

►Exercícios

Dado ca = {'matlab', [5 3; 7 6]}  Adiciona uma célula com o elemento [8, 7] recorrendo a

concatenação

 Adiciona a linha {'nebm‘, 5, 6} recorrendo a atribuição Do array de células ca obtido:

Executa cellplot(ca)

Selecciona a primeira coluna de células e verifica o resultadode iscellstr aplicado ao resultado

Coloca, respectivamente, nas variáveis a e b, o conteúdo dascélulas (1,1) e (1,2) num único comando

Porque é válido cat(1, ca{1,2:3}]) mas não [ca{1,2:3}](equivalente a cat(2, ca{1,2:3}]))?

 

Page 50: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 50/113

Estruturas (1) Tipo com um conjunto de contentores de dados – os

campos Um campo pode conter uma outra estrutura

O campo tem um nome e é acedido comvariavel.nome

Num arrays de estruturas, todos os elementos têm de

conter os mesmos campos Mas cada estrutura do array de estruturas pode ter um

tipo de dados diferente associado ao mesmo campo

 

Page 51: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 51/113

Estruturas (2)>> salas.nome = 'X02.3';>> salas.capacidade = 50;>> salas

salas =

nome: 'X02.3'capacidade: 50

>> salas(2).nome = 'X4.3';>> salas(2)

ans =

nome: 'X4.3'capacidade: []

>> salas(2).capacidade = 25;

>> salas

salas =

1x2 struct array with fields:nomecapacidade

>> salas(2).capacidade

ans =

25

>> {salas.nome} (= {salas(:).nome})

ans =

'X02.3' 'X4.3'

 

Page 52: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 52/113

Referências a funções (1) Tipo que permite chamar indirectamente uma função

Se var é uma referência a uma função, a função pode serchamada com var(argumento1, argumento2, …)

Referência é criada com: @nome_da_função @(arg1, arg2, …)função_estilo_lambda

Está a ser descontinuada a criação de arrays não escalaresde referências para funções Usar alternativamente arrays de células

 

Page 53: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 53/113

Referências a funções (2)>> fh = @sin;>> fh(pi/6)

ans =

0.5000

>> fh = @(x) x.^2;>> fh([0:4])

ans =

0 1 4 9 16

>> [@sin @tan]Warning: non-scalar function handleswill not be supported past R2008a.

ans =

@sin @tan

>> fhs = {@sin @tan};>> fhs{1}(pi/6)

ans =

0.5000

>> fhs = @(x) [sin(x) tan(x)];>> fhs(pi/6)

ans =

0.5000 0.5774

Salvo em atribuições, evitar usar espaçosnas definições de funções estilo lambda,ou então envolver a função emparênteses, i.e., (@(args) definição)

 

Page 54: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 54/113

►Exercícios  Atribui à variável funs um array 1 por 2 do tipo estrutura

com os campos “nome” e “funcao”. Os elementos devem serpreenchidos com os pares ('quadrática', @(x)x^2) e('cúbica', @(x)x^3) Extrai o valor do campo “nome” no 2º elemento do array  Extrai simultaneamente os campos “nome” dos 2 elementos e,

numa única instrução: Coloca os valores nas variáveis a e b Coloca os valores num array de células

Cria uma referência para uma função ( f ) que recebe edevolve uma referência para uma função tal quef: (arg: x -> arg(x)) -> (ret: x -> arg(x).^2)arg(x) é um array numérico  Verifica que f(x -> x^2)(2) = 16 ao avaliar a correspondente expressão

MATLAB

 

Page 55: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 55/113

M files, estruturas de controlo, funções, funções estilo lambda,

passagem por valor, scoping e closures, depuração

 

Page 56: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 56/113

M-files M-files são ficheiros de extensão .m com código

MATLAB

Há dois tipos de M-files: Scripts Funções

São acedidos pelo nome (removida a extensão)

São procurados no directório de trabalho e no path

 

Page 57: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 57/113

Scripts Operam sobre o workspace base (o mesmo que é

usado ao introduzir comandos interactivamente)

Não recebem argumentos (“argumentos de entrada”)

Não retornam valores (“argumentos de saída”)

Não podem definir funções (excepto funções tipolambda)

 

Page 58: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 58/113

Scripts (2)

 

Page 59: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 59/113

Estruturas de controlo (1) if – executa instruções se dada condição for verdadeira

if expressão1

instruções1;

elseif expressão2instruções2;

elseinstruções3;

end

Pode haver mais blocos elseif (ou nenhum).

Pode não haver bloco else.

 

Page 60: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 60/113

Estruturas de controlo (2) while – executa reiteradamente um conjunto de

instruções enquanto dada condição for verdadeira

Pode usar-se break , continue e return

while expressão1instruções1;

end

>> v = 2; while v < 8000; v = 2*v; end; v

v =

8192

Exemplo:

 

Page 61: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 61/113

Nota na avaliação de condições (1)  A condição tem de ser uma expressão lógica ou conversívelpara expressão lógica

Se a expressão não for escalar, todos os seus elementos têmde ser verdade ou conversíveis para verdade para que as

instruções sejam executadas Qualquer número que não zero é convertido para o valor de

 verdade

>> a = [0 1 1];>> if a, disp('verdadeiro'), else, disp('falso'), end

falso

>> a = [5 1 1; 1.4 1 1];>> if a, disp('verdadeiro'), else, disp('falso'), endverdadeiro

 

Page 62: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 62/113

Nota na avaliação de condições (2) Condições compostas podem não ser completamente

avaliadas Exemplo: em if 1 || func(), func() nunca é avaliada

Importante se func() for custosa a avaliar ou tiver efeitos colaterais Pode usar-se o operador | para forçar a avaliação de ambos os termos

Funções importantes: any e all

 Aplicados a vectores, devolvem um escalar  Aplicados a uma matriz, actuam ao longo das colunas

Pode especificar-se a dimensão em que actuam

 

Page 63: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 63/113

for – itera ao longo de uma variável

Itera ao longo das colunas Na construção for var=expr, var é em cada iteração um

 vector coluna tirado de uma coluna de expr

Pode usar-se break , continue e return

Geralmente usado em construções do génerofor var=inicio:passo:fim

Estruturas de controlo (3)

 

Page 64: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 64/113

Nota: evitar usar i e j como iteradores visto estesrepresentarem a unidade imaginária

Estruturas de controlo (4)>> for k=1:3, disp('novaiteração'), disp(k), endnova iteração

1

nova iteração2

nova iteração3

>> var = [(1:3).' (2:4).'];>> for k=var, disp('novaiteração'), disp(k), endnova iteração

123

nova iteração2

34

 

Page 65: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 65/113

Funções de M-files (1) Um M-file pode definir uma função pública (primária) Função primária tem de ter o mesmo nome que o

ficheiro em que está definida (tirado o .m)

 Após terminar o corpo da função primária, podem serdefinidas várias funções privadas auxiliares (chamadasde subfunções no MATLAB)

Dentro do corpo das funções podem ser definidas

funções aninhadas (nested functions) Uma função em MATLAB pode ter retornos

múltiplos! (chamados de argumentos de saída noMATLAB)

 

Page 66: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 66/113

Funções de M-files (2)function y = prodpols(coefs, x)%PRODPOLS Avalia polinómio em dado ponto, dados os seus coeficientes.% y = prodpols(coefs, x) avalia o polinómio de coeficientes coefs no ponto% x. Mais precisamente y é o somatório de coefs(i) * x^(i-1) com i desde i% até ao comprimento de coefs, o qual deve ser um vector numérico.

if ~isvector(coefs) || ~isnumeric(coefs)error('prodpols:badarg1', ...

'Primeiro argumento tem de ser vector numérico.');elseif ~isscalar(x) || ~isnumeric(coefs)

error('prodpols:badarg2', ...'Segundo argumento tem de ser escalar numérico.');

end

xpow = zeros(size(coefs));for k=1:length(coefs)

xpow(k) = x^(k-1);end

y = sum(coefs .* xpow);

end 

Page 67: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 67/113

Funções de M-files (3)>> who>> prodpols([-10 4 4; 1 1 1], 2)??? Error using ==> prodpols at 8Primeiro argumento tem de ser vector numérico.

>> prodpols([-10 4 4], 2)

ans =

14

>> who

Your variables are:

ans

>> help prodpolsPRODPOLS Avalia polinómio em dado ponto, dados os seus coeficientes.y = prodpols(coefs, x) avalia o polinómio de coeficientes coefs no pontox. Mais precisamente y é o somatório de coefs(i) * x^(i-1) com i desde iaté ao comprimento de coefs, o qual deve ser um vector numérico.

 

Page 68: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 68/113

Funções de M-files (4)function y = prodpols(coefs, x)%PRODPOLS Avalia polinómio em dado ponto, dados os seus coeficientes.% (documentação e verificação dos argumentos suprimidos)

xpow = powers(size(coefs), x);y = sum(coefs .* xpow);

end

function out = powers(sizecoef, x)%POWERS Subrotina para calcular potências de x.% out = powers(sizecoef, x) recebe um array com as dimensões dum vector de% coeficientes e calcula as potências de x tais que out(i) = x^(i-1) com i

% desde 1 até ao comprimento indicado por sizecoef.out = zeros(sizecoef);for k=1:max(sizecoef)

out(k) = x^(k-1);end

end

 

Page 69: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 69/113

Funções de M-files (5)

Subfunções podem aparecer em qualquer ordem, desde quedepois da primária, a qual tem de ser sempre a primeira no M-file

Subfunções podem chamar outras subfunções

>> help prodpolsPRODPOLS Avalia polinómio em dado ponto, dados os seus coeficientes.(documentação e verificação dos argumentos suprimidos)

>> help prodpols>powersPOWERS Subrotina para calcular potências de x.

out = powers(sizecoef, x) recebe um array com as dimensões dum vector decoeficientes e calcula as potências de x tais que out(i) = x^(i-1) com idesde 1 até ao comprimento indicado por sizecoef.

>> prodpols([-10 4 4], 2)

ans =

14

 

Page 70: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 70/113

Scope (1) Scope é o contexto em que uma variável está definida

O MATLAB guarda as variáveis em workspaces

O workspace base é usado por scripts e pela linha decomandos interactiva

 As funções têm o seu próprio workspace e só podem

aceder a outros workspaces Se alguma variável for declarada global em ambos os

workspaces

Usando as funções evalin ou assignin

 

Page 71: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 71/113

Scope (2)

Evitar usar estemecanismo afavor de

argumentos deentrada e saída ouclosures

function functesteglobal glgl = 3; %variável é global e é partilhada com outros workspaces que a

%tenham declarado globallo = 3; %variável é local e perder-se-á quando a função retornar

end

>> gl = 5; lo = 5;>> functeste>> gl, lo

gl =

5

lo =

5

>> global gl>> gl = 5; lo = 5;>> functeste>> gl, lo

gl =

3

lo =

5

 

Page 72: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 72/113

►Exercícios Constrói uma função partition, que particiona um array de células, tal

que:  A função recebe 3 argumentos

cellarr, um array de células vectorial 1 por k , com k >= 0 n, um inteiro não negativo (o tamanho das partições) d, um inteiro positivo (o offset entre as partições)

 A função devolve 2 argumentos Um array de células n por y, tal que cada linha é um subarray de cellarr de

tamanho n, com os seguintes conteúdos: Linha 1: [cellarr(1), cellarr(2), …, cellarr(n)]

Linha 2: [cellarr(1+d), cellarr(2+d), …, cellarr(n+d)]

Linha 3: [cellarr(1+2d), cellarr(2+2d), …, cellarr(n+2d)] etc. Um inteiro positivo com o número de partições criadas

Nota que y == floor((d+length(cellarr)-n)/d)

Todas as linhas têm o mesmo tamanho, logo alguns elementos finais decellarr podem não aparecer nas partições

Se d > n, alguns elementos do meio não figurarão no resultado

 

Page 73: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 73/113

Passagem por valor (1) Em MATLAB, todas as variáveis são passadas por

 valor

Não se podem construir referências para variáveis de

modo a obter o mesmo efeito que na passagem porreferência (como em C) Não se podem facilmente construir estruturas de dados

como listas ligadas

Excepções: objectos de Java e classes de utilizador queherdam de handle.

 

Page 74: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 74/113

Passagem por valor (2)function teste(a, b)a.campo = 2;b = 4;

end

>> x.campo = 10; b = 3;>> teste(x, b);>> x, b

x =

campo: 10

b =

3

function [a b] = teste(a, b)a.campo = 2;b = 4;

end

>> x.campo = 10; b = 3;>> [x b] = teste(x, b)

x =

campo: 2

b =

4

 

Page 75: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 75/113

Scope (3) Funções aninhadas também têm o seu próprio

workspace

Podem, contudo, aceder aos workspaces das funçõesenvolventes

Regra: uma variável é guardada no workspace dafunção mais exterior que a usa Funções envolventes não podem usar variáveis que são

argumentos de saída nas funções aninhadas

 

Page 76: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 76/113

Scope (4)function functestek = 3;a = 1;function nested1

nested2;

k = a * 3;function nested2a = a * 2;

endenddisp(k); %k == 3nested1;disp(k); %k == 6

%nested2; Inválido, nested2 sópode ser chamada por nested1

nested1;disp(k); %k == 12

end

function functestefunction nested

for k=1:4;

end

end

k = 3;while k <= 5 %ciclo nunca termina!

nested;k = k + 1;

endend

 

Page 77: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 77/113

Scope (5) O workspace da função envolvente continua disponível

à função aninhada mesmo depois de a funçãoenvolvente retornar!

Exemplo: Função que recebe um conjunto de coeficientes e

devolve a função polinomial construída com essescoeficientes. I.e., dado coefs devolve uma função

Função devolvida tem um mecanismo para aplicar umfactor de escala persistente, mas alterável, ao polinómio

 

Page 78: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 78/113

Scope (6) Ainda sem o mecanismo para o factor de escala:function pol = getpol(coefs)%GETPOL Função polinomial dados os seus coeficientes% pol = getpol(coefs) devolve um handle para uma função polinomial cujos

% coeficientes são dados pelo vector coefs.

function out = powers(x)out = zeros(size(coefs));for k=1:length(coefs)

out(k) = x^(k-1);end

end

function y = funpol(x)y = sum(coefs .* powers(x));

end

pol = @funpol;end

 

Page 79: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 79/113

Scope (7) Opções para definir o factor de escala persistente Usar variáveis globais

Potencialmente perigoso e sem mecanismos de validação

(poderia definir-se essa global com uma string, por exemplo)  Adicionar um segundo argumento à função polinomial

devolvida, o factor de escala Melhor, mas pouco prático porque

se teria de incluir o segundo argumento em todas as chamadas ter-se-ia de guardar o factor de escala nalguma variável

acessível no mesmo contexto em que se chamará a funçãopolinomial devolvida

 

Page 80: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 80/113

Scope (8)function [pol setfact] = getpol(coefs)%GETPOL Função polinomial dados os seus coeficientes% [pol setfact] = getpol(coefs) devolve um handle pol para uma função% polinomial cujos coeficientes são dados pelo vector coefs e uma função% de argumento único que define um factor de escala que será aplicado a% todas as chamadas à função polinomial devolida

%Função powers() igual ao exemplo anterior (suprimida por falta de espaço)factor = 1;

function y = funpol(x)y = factor * sum(coefs .* powers(x));

end

function deffactor(fact)

if ~isscalar(fact) || ~isnumeric(fact)error('getpol:deffactor:badarg', ...'O factor tem de ser um escalar numérico.');

endfactor = fact;

end

pol = @funpol;setfact = @deffactor;end

 

Page 81: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 81/113

Scope (9)>> [pol setfact] = getpol([-10 4 4])

pol =

@getpol/funpol

setfact =

@getpol/deffactor

>> pol(2)

ans =

14

>> setfact('str')??? Error using ==> getpol>deffactor at 23O factor tem de ser um escalar numérico.

>> setfact(.5)

>> pol(2)

ans =

7

>> [pol2 setfact2] = getpol([-10 4 4]);

>> setfact2(2);>> pol(2)

ans =

7

 

Page 82: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 82/113

Depuração (1)

 

Page 83: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 83/113

Depuração (2)>> [pol2 setfact2] = getpol([-10 4 4]);29 pol = @funpol;K>> dbcont>> pol2(2)13 out(k) = x^(k-1);K>> whosName Size Bytes Class Attributes

---- powers -----------------------------------------------------ans 0x0 0 (unassigned)k 1x1 8 doubleout 1x3 24 doublex 1x1 8 double

---- getpol -----------------------------------------------------

ans 0x0 0 (unassigned)coefs 1x3 24 doublefactor 1x1 8 doublepol 1x1 32 function_handlesetfact 1x1 32 function_handle

K>> dbstep14 end

K>> dbquit 

Page 84: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 84/113

Depuração (3) dbclear - Remove breakpoint.

dbcont - Continue execution.

dbdown - Change local workspace context.

dbquit - Quit debug mode.

dbstack - Display function call stack.

dbstatus - List all breakpoints.

dbstep - Execute one or more lines.

dbstop - Set breakpoint.

dbtype - List M-file with line numbers. dbup - Change local workspace context.

 

Page 85: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 85/113

Número de argumentos (1) Argumentos de entrada Uma função pode ser chamada com menos argumentos

de entrada do que aqueles que são declarados no

cabeçalho da função Função nargin devolve o número de argumentos

passados Não se pode referir argumentos não definidos, pelo que

se deve, caso não tenham sido passados todos os

argumentos Emitir um erro (usar nargchk)  Atribuir valores por defeito

 

Page 86: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 86/113

Número de argumentos (2)function res = teste(a, b)res = a * b;

end

>> teste(3, 4, 5)

??? Error using ==> testeToo many input arguments.

>> teste(3, 4)

ans =

12

>> teste(3)??? Input argument "b" is undefined.

Error in ==> teste at 2res = a * b;

function res = teste(a, b)if nargin == 0

error(nargchk(1, 2, nargin, 'struct'))elseif nargin == 1

b = 1;end

res = a * b;end

>> teste()??? Error using ==> teste at 3Not enough input arguments.

>> teste(3)

ans =

3

 

Page 87: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 87/113

Número de argumentos (3) Argumentos de saída Uma chamada a uma função pode especificar menos

argumentos de saída do que aqueles que são declarados

no cabeçalho da função Não são emitidos erros como nos argumentos de entrada, os

retornos extra são simplesmente ignorados

 Ainda assim, a função pode verificar nargout para evitar fazercálculos desnecessários

Podem gerar-se erros com nargoutchk

 

Page 88: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 88/113

Número de argumentos (4)function [a b] = teste()a = 3;b = 4;

end

>> a = teste

a =

3

>> [a b] = teste

a =

3

b =

4

>> [a b c] = teste??? Error using ==> testeToo many output arguments.

 

Page 89: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 89/113

Número de argumentos (5) Funções podem ter um número arbitrário deargumentos de entrada e saída Usar varargin no final da lista de argumentos de

entrada Usar varargout no final da lista de argumentos de saída

 Variáveis varargin e varargout são vectores de células

>> [a b] = prodsum(5)

??? Error using ==> prodsumToo many output arguments.

Error in ==> prodsum

>> [a b c] = prodsum(5, [2 3 4], [2 3 4])

(a = 5, b = 9, c = 24)

function [a varargout] = prodsum(a, varargin)

if length(varargin) >= 1varargout{1} = sum(varargin{1});endif length(varargin) == 2

varargout{2} = prod(varargin{2});end

end

 

Page 90: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 90/113

►Exercícios Altera partition

Por forma a que o último argumento seja facultativo. Seeste não for fornecido, as partições resultantes deverão

ser tão numerosas quanto possível, mas sem qualquersobreposição e

de modo a que todos os argumentos sejam validados

 

Page 91: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 91/113

Plots 2-D e 3-D, edição

 

Page 92: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 92/113

Gráficos 2-D Função plot

plot(y) produz gráfico dos elementos do vector y em funçãodos respectivos índices ou, se y for complexo, da parte

imaginária em função da parte real plot(x,y) produz gráfico dos elementos do vector y em

função dos elementos do vector x

plot(x1,y1,...,xn,yn) produz gráficos dos elementos do vector yi em função dos elementos do vector xi

Os gráficos são lineares por troços, entre cada par depontos

 

Page 93: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 93/113

Exemplos (1)>> x1=-2*pi:0.1:2*pi;

>> x2=-2*pi:1:2*pi;

>> plot(x1,sin(x1),x2,sin(x2))

 

Page 94: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 94/113

Formatação Básica É possível especificar a cor, estilo da linha emarcadores para os pontos do gráfico usando

plot(x1,y1,’color_style_marker1’,x2,y2,’color_style_marker2’,...)

É também possível adicionar um título ao gráfico,legendá-lo e identificar os eixos, usando os comandostitle, legend, xlabel e ylabel.

Os limites do sistema de eixos podem ser alterados epode ser adicionada uma grelha ao gráfico

 

Page 95: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 95/113

Exemplos (2)>> x1=0:pi/100:2*pi;

x2=0:pi/10:2*pi;

plot(x1,sin(x1),'m--',x2,sin(x2),'ks');

grid on

>> figure;

plot(x1,sin(x1),'m--',x2,sin(x2),'ks');

xlabel('x (rad)'); ylabel('sin(x)');

title('Gráfico da função sin(x) para xentre 0 e 2\pi');

axis([0 2*pi -1.5 1.5]); grid on

 

Page 96: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 96/113

Exemplos (3)>> x=-pi:pi/100:pi; xm=-pi:pi/10:pi;y1=sin(x); y2=sin(2*x); ym=sin(xm);

figure;plot(x,y1,'LineStyle','--','LineWidth',4,'Color','k');xlabel('x (rad)'); grid on

hold on

plot(x,y2,'LineStyle',':','LineWidth',2);legend('sin(x)','sin(2x)','Location','SouthEast');

plot(xm,ym,'LineStyle','none','Marker','o','MarkerSize',10,'MarkerEdgeColor','k','MarkerFaceColor','r');

hold off

text(-pi,0,'\leftarrow sin(-\pi)=0','FontSize',14,'FontWeight','Bold')set(gca,'YTick',[-1 -0.5 0 0.5 1]);set(gca,'XTick',[-pi -pi/2 0 pi/2 pi]);

 

Page 97: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 97/113

Exemplos (4)

 

Page 98: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 98/113

Exemplos (5)>> for k=0:pi/50:2*pi

plot(sin(k),cos(k),'ro');

axis equal; axis([-1 1 -1 1])

pause(.2); hold on;

end

 

Page 99: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 99/113

Exemplos (6)>>

for k=0:pi/10:2*pi

subplot(1,2,1);

line([sin(k) sin(k+pi/10)],[cos(k) cos(k+pi/10)],'Color','g');

axis equalaxis([-1.5 1.5 -1.5 1.5])

hold on;

subplot(1,2,2);

line([sin(k) sin(k+pi/10)],[cos(k) cos(k+pi/10)],'Color','r');

axis([-1.5 1.5 -1.5 1.5])

pause(.5);

hold on;

end

 

Page 100: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 100/113

Exemplos (7)

 

Page 101: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 101/113

Exemplos (8)>> n=randn(1000,1); figure;

subplot(3,2,[3 5]); plot(0:.1:2*pi,cos(0:.1:2*pi));

subplot 321; hist(n,10);

subplot 322; hist(n,100);

subplot 324; grid on;

subplot 326;

 

Page 102: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 102/113

Janela com vários gráficos A função subplot permite a apresentação de vários

gráficos numa mesma janela

subplot(m,n,p) ou subplot mnp divide a janelanuma matriz m por n de subgráficos e selecciona o p-ésimo gráfico como gráfico activo

Os subgráficos são numerados da esquerda para a direitaao longo da primeira linha da matriz, depois da segundae assim por diante

 

Page 103: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 103/113

Outros Gráficos Gráficos com escalas logarítmicas

loglog(), semilogy(), semilogx()

>> x=0:.1:5; y=exp(x);figuresubplot(1,2,1)plot(x,y,'Color','m','LineWidth',3)grid on

subplot(1,2,2)semilogy(x,y,'Color','m','LineWidth',3)grid on

 

Page 104: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 104/113

Outros Gráficos (2) Gráficos 3-D

plot3(), surf(), mesh(), contour()

sphere, cylinder

>> t2=0:.01:10*pi;

[x y]=pol2cart(t2,t2);figuresubplot(2,2,1)plot3(x,y,0:3141);grid onsubplot(2,2,2)plot(x,y);grid onsubplot(2,2,[3 4])polar(t2,t2,'--r');

 

Page 105: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 105/113

Outros Gráficos (3)>> [x y z]=peaks; figure;

subplot(1,2,1);mesh(x,y,z);

subplot(1,2,2);contour(x,y,z); colormap jet;colorbar

 

Page 106: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 106/113

Outros Gráficos (4) area() para colorir a área por baixo de uma curva efill() para criar polígonos coloridos

>> y=[4 2 9 -2 1 3]; area(y)

 

Page 107: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 107/113

Outros Gráficos (5) Gráficos de Barras e de Queijo

bar() e barh(), bar3() e bar3h(), pie()

Stem graphs

>> t=0:pi/10:3*pi;y=cos(t);stem(y,'Marker','h','MarkerEdgeColor','k',

'MarkerFaceColor','g','LineStyle','--','Color','g')

 

Page 108: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 108/113

► Exercício Refazer o Exemplo 5 usando

a exponencial complexa

a equação da circunferência em coordenadas cartesianas

Desenhar quadrado preenchido a vermelho

 

Page 109: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 109/113

Figure Windows Quando a função plot é executada o MATLAB abre uma janela

(Figure Window) para apresentar o gráfico, caso não haja já umaaberta; no caso de haver janelas abertas o gráfico é desenhado nosistema de eixos da última janela activa, substituindo o que lá seencontrava Pode usar-se o comando hold on para manter o gráfico anterior

O comando figure abre uma nova Figure Window numerada apartir da janela de menor número que se encontre aberta Pode especificar-se o número da figura, escrevendo figure(n)

Os comandos close, close figure n e close all fecham ,respectivamente, a janela actual, a janela especificada nocomando e todas as janelas

 

Page 110: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 110/113

Figure Windows (2)  A janela permite a

inspecção do gráficodesenhado, sendopossível, por exemplo,

 Visualizar os valores dospontos

Fazer zoom a partes do

gráfico Mudar a sua orientação

(útil em 3-D) e movê-lo

 

Page 111: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 111/113

Figure Windows (3) É possível editar o gráfico na própria janela (mudando

cores e estilos das linha, limites dos eixos, etc.) e obtero código correspondente à figura com as alterações

efectuadas fazendo File -> Generate M-File

O gráfico pode ser guardado em diversos formatos(.jpg, .png, .fig, .eps)

 

Page 112: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 112/113

Construção de interfaces gráficos com o GUIDE

 

Page 113: Curso de MATLAB%c2%ae

5/7/2018 Curso de MATLAB%c2%ae - slidepdf.com

http://slidepdf.com/reader/full/curso-de-matlabc2ae 113/113

Problema Construir um interface para desenhar polinómios A granularidade do gráfico (número de pontos da

curva) será especificada ao abrir o interface

Interface terá Zona onde o gráfico é desenhado Colecção de lista de coeficientes dos polinómios que se

podem desenhar

Podem adicionar-se listas de coeficientes Campos onde se escolhe o intervalo onde o gráfico é

desenhadod h l d l