Computação 2015-2016 Ana Maria Faustino
2015-2016
MATLAB Matlab é uma linguagem de computação científica de alto nível. Integra computação, visualização e programação, de um modo fácil, com uma notação próxima da linguagem matemática. Apareceu para facilitar a utilização de programas, em Fortran, que operavam com matrizes. Daí o nome MATLAB de matrix laboratory. Janelas MATLAB Desktop Command Window ( janela de comandos ) para trabalhar inicializar variáveis e executar comandos; Command History ( histórico dos comandos ) guarda as instruções introduzidas no command window; Help Browser ( ou ) manuais MATLAB em HTML; Current Directory visualiza a directoria corrente permitindo modificá-la; Workspace ( espaço de trabalho ) conjunto das variáveis ver guardadas em memória durante a sessão.para visualizar indicações acerca destas variáveis no command window use os comandos who ou whos ); Array editor visualiza a variável através de uma tabela de dupla entrada permitindo editá-la. editar Editor/debugger permite criar e emendar ficheiros.m Profiler ferramenta que permite obter informação acerca da execução de comandos (ver Profiler documentation). ( Figure visualiza gráficos ) Exemplo de um arranjo de janelas MATLAB Computação 1
Elementos Para escrever comandos MATLAB são necessários caracteres, constantes, operadores aritméticos, de relação e lógicos. Caracteres Para escrever os comandos dispomos dos seguintes caracteres: as 26 letras maiúsculas do alfabeto inglês, de A a Z; as 26 letras minúsculas do alfabeto inglês, de a a z; dígitos de 0 a 9; caracteres simbólicos :! " # $ % & ( ) +, -. / : ; < = >? [ \ ] ^ _ ' { } ~ Outros símbolos especiais (...,@,...) Código para representar caracteres ASCII (American Standard Code for Information Interchange) (pode ver na pág 415 de MATLAB Programming for Engineers, Chapman ). Pode também ver o comando char. Constantes Números letra e letra i ou j Os números em Matlab são, normalmente, escritos na notação decimal com um ponto decimal opcional e sinais mais ou menos. Os números na notação científica usam a letra e para especificar o expoente da potência de 10. Os números imaginários podem ser escritos com a letra i ou j. Exemplos - Notação decimal Inteiros -7; -99; 5789; Reais -0.0001; 1.235e-20; -23.007e13; 30001e5; Complexos 1+2i; 7e2j; Representam: -7;-99; 5789;-0.0001; 1.235 10-20 ;-23.007 10 13 ; 30001 10 5 ; 1+2i; 7 10 2 i Computação 2
Constantes Caracteres ( "string") Um string é um conjunto de caracteres entre plicas ( ' ' ) (' é o carácter debaixo de?). Na realidade é um vector em que cada componente guarda o código Windows 1252 (além do código ASCII, codifica caracteres com acentos) do respectivo carácter usando 16 bits (1), 2 bytes (2) Exemplo 'isto é uma constante constituída por caracteres' Funções constantes ans resultado mais recente; pi 3.14159265...; i unidade imaginária 1 ; j mesmo que i; eps precisão dos números em vírgula flutuante, =2-52 ( em precisão dupla 16 algarismos significativos); realmin menor número em vírgula flutuante, 2-1022 (10-308 ); realmax maior número em vírgula flutuante, (2-)2 1023 (10 308 ); Inf (overflow > realmax); NaN " Not-a-number" (0/0),...; Os números representáveis são apenas um número finito de pontos no intervalo ponteado, mais cerrados nas proximidades do zero. Normalmente estão armazenados em dupla precisão ( * ), mas também podem ser armazenados em precisão simples ( * ). Os números representáveis em precisão simples são menos do que os em precisão dupla. Além de mais espaçados, o intervalo entre o menor e o maior número em precisão simples é mais pequeno do que o respectivo intervalo em precisão dupla....... -Inf -10 308-10 -308 0 10-308 10 308 Inf (*) - Os números são armazenados na base 2. Os números em precisão dupla ocupam 8 bytes (64 bits) enquanto que os números em precisão simples ocupam 4 bytes (32 bits). Os números reais são armazenados em vírgula flutuante, isto é, parte desses bits são para a parte fraccionária ( f ) da mantissa e parte para o expoente ( e ) da potência de 2 e um bit para o sinal ( s) - s 1.f 2 e (1) bits abreviatura de "binary digits" (0 e 1). (2) byte = 8 bits Outras unidades kb kilobyte = 1024 bytes (1024=2 10 ) MB Megabyte = 1024 2 bytes GB Gigabyte = 1024 3 bytes Computação 3
Variáveis nomes As variáveis armazenam informação que pode ser modificada ao longo da sessão. Para as representar usa-se um nome cujo primeiro carácter tem que ser uma letra e os restantes caracteres podem ser letras, dígitos ou _. Pode usar-se o número de caracteres que se quiser mas só distingue os 63 primeiros. Distingue maiúsculas de minúsculas. Logo A a Exercício: Diga se é possível ou não usar os seguintes nomes para representar variáveis: a) soma10p b) 10psoma c) Este_nome_e_comprido d) Achas_este_nome_comprido? e) _dados Resultados: a)sim; b)não ( 1ºcarac.=1 ); c)sim; d)não ( 1 carac.=? ); e) não ( 1ºcarac.=_ ); Operadores aritméticos ponto + sinal + (operador unário); + adição; - sinal (operador unário); - subtracção; * multiplicação;.* multiplicação ( de arrays ); / divisão à direita ( a/b=a*b -1 );./ divisão à direita ( de arrays ); \ divisão à esquerda ( a\b=a -1 *b );.\ divisão à esquerda ( de arrays ); ^ exponenciação;.^ exponenciação ( de arrays ); transposta da conjugada;. transposta; kron produto tensorial de Kronecker. As operações precedidas pelo ponto repetem a mesma operação para cada elemento, enquanto que as operações sem ponto são matriciais. Em qualquer dos casos os operandos têm que ser dimensionalmente compatíveis. Computação 4
nomes MATLAB Expressões aritméticas operadores aritméticos + variáveis + funções matlab (*) + ( ) Exemplo a 2 b 2 sen2 ac (a^2+b^-2)/(a*c)*sin(2*pi) Precedência das operações aritméticas: 1. O conteúdo dos parêntesis, começando pelo mais interno; 2. Funções; 3. Sinais (operador unário); 4. ^ ( a associação faz-se da esquerda para a direita ) Exemplo: 2^2^3=(2^2)^3 5. *, / e \ ( a associação faz-se da esquerda para a direita ) 6. + e ( a associação faz-se da esquerda para a direita ) Expressões lógicas (proposições): 1. a 1 opr a 2 2. b 1 opl b 2 ou opl b 1 onde a é uma expressão aritmética ou um "string" (usa o código para operar), b é uma expressão (aritmética ou lógica), opr é um operador de relação e opl é um operador lógico. (Se b é aritmético, b=0 é falso e b0 é verdadeiro) Operadores de relação: == - igual (equal) ~= - diferente (not equal) < - menor (less than) > - maior (greater than) <= - menor ou igual (less than or equal) >= - maior ou igual (greater than or equal) Exemplos: Operações Resultados 4*5<=15 0 2*2==4 1 'a'<'b' 1 (*) Uma lista de funções Matlab encontra-se no Anexo 1 ( pág 67) Computação 5
Operadores Lógicos & (conjunção) (disjunção) xor ou exclusivo ~ negação b 1 b 2 b 1 &b 2 b 1 b 2 xor(b 1,b 2 ) ~b 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 circuito curto 1 verdadeiro; 0 falso Se usarmos os operandores && e como alternativa ao & e, respectivamente, o valor lógico do segundo operando só é analisado se o valor lógico do primeiro não for suficiente para definir o valor lógico de toda a proposição. Por exemplo, na expressão (b ~= 0) && (a/b > 5), se b=0, a divisão do segundo operando não chega a ser executada, evitando a divisão por zero. (Não pode usar circuitos curtos com arrays). Precedência das operações (Matlab-versão 7) 1. parêntesis ( ); 2. transposta., potência.^, transposta da conjugada, potência de matrizes ^; 3. sinal +, sinal -, negação lógica ~; 4. multiplicação.*, divisão à direita./, divisão à esquerda.\, multiplicação de matrizes *,divisão de matrizes à direita /, divisão de matrizes à esquerda \; 5. adição +, subtracção -; 6. operador : ( pág.11); 7. operadores de relação <, <=, >, >=, ==, ~=; 8. operador &; 9. operador ; 10. operador &&; 11. operador. Em todos os níveis de precedência a associação faz-se da esquerda para a direita. Computação 6
Exemplos Seja var1 = 1; var2 = -4; var3 = 5 e var4 = 0 Expressão lógica resultado var1==1 1 cos(pi/2)==0 0 abs(cos(pi/2))<1.e-12 1 abs(cos(pi/2))<1.e-16 1 abs(cos(pi/2))<1.e-17 0 var1>var2&var3<var4 0 ~var2 0 var1 var3&var4 1 (var1 var3)&var4 0 ~var1&var4 0 ~(var1&var4) 1 Quando se escreve uma expressão, em caso de dúvida, usa-se parêntesis. Exercícios Escreva as instruções Matlab ou as expressões aritméticas ou lógicas que faltam para completar a seguinte tabela: Expressão 2 x y cos 3k P A 3 B 0 log 10 10 3 x y tan 2 x y P 2 A B 2 ( x 2)( x 3) x y P 3 x y 0.510 5 Instrução Matlab P4 A B 2 P5 abs(x) 0.2e 4 x ~ 4&3 Computação 7
Instruções de atribuição variável = expressão Com o significado: a variável passa a guardar o resultado da expressão aritmética ou lógica. As variáveis na expressão já têm que armazenar uma informação. Se não for escrito "variável =" o valor da expressão é atribuído à variável ans continuação Se a variável já existir o valor antigo é perdido. A instrução deve ocupar uma linha, se não couber numa linha use três pontos (...) seguido de Enter para indicar que a instrução continua na linha de baixo Exemplo: a = 1+2+3+4+5+6+7... +8+9+10 O valor da variável é escrito no Command Window. O ponto e escrever vírgula ;, no fim da instrução elimina essa escrita. Exemplo: a = 2*4; b = a/2 Pode escrever-se mais do que uma instrução por linha desde separadores que se separe as instruções por vírgulas, (escreve) ou por ponto e vírgula ; (não escreve). Exemplo: a = 2*pi; b = sin(a), c = 2*b sintaxe Os argumentos das funções estão sempre dentro de parêntesis curvos ( ) e separados por vírgulas,. Se a expressão for lógica a variável toma o valor lógico 0 ou 1 consoante a expressão é falsa ou verdadeira. Exemplo: a = 2 > 3, b = a 2 < 3 Nas expressões com os operadores lógicos, todas as variáveis diferentes de zero são consideradas como verdadeiras (apesar de nem sempre serem consideradas lógicas) Exemplo: a = -2; b = a&1, islogical(a) A variável elementar em Matlab é uma matriz. Em Matlab um escalar é uma matriz 11 Computação 8
Matrizes e "arrays" array Um "array" (variável indexada) é uma colecção de elementos, todos do mesmo tipo, a que é atribuído um nome. Cada elemento de um "array" é identificado por esse nome e por um conjunto de índices colocados dentro de parêntesis e separados por vírgulas. Exemplos: Sendo v1 2 5 3 v2 2.5 1 0 então 1 1 A 7.1 2 coluna j 0 0 3.4 2.3 1.2 3.4 6 5 linha 7 v1(2)=5; v2(2)=-2.5; A(2,1)=7.1; A(2,3)=1.2; A(3,4)=7 aij i Os "arrays" podem ter 1, 2 ou vários índices consoante as características que interessa realçar. Por exemplo, num array com os coeficientes de um sistema linear interessa ter um acesso fácil à equação e aos coeficientes de cada variável para facilitar a soma de equações. Consegue-se isso com dois índices, um índice fica associado à equação e o outro fica associado à variável. No exemplo anterior v1 e v2 têm um índice, que indica a ordem do elemento, e A tem dois, o primeiro indica a linha ( posição horizontal ) e o segundo indica a coluna ( posição vertical ) ocupada pelo elemento. matriz Uma matriz é um "array" com dois índices a que está associada uma aplicação linear ( aplicação entre espaços vectoriais definidos sobre um corpo, o MATLAB trabalha no corpo C - Álgebra ). O conjunto de matrizes munido das operações e + de matrizes e produto por um escalar formam estruturas algébricas com propriedades bem definidas. Computação 9
dimensões A matriz tem duas dimensões representada por mn, onde m é o número de linhas e n o número de colunas. O número de elementos da matriz é mn. Um vector é uma matriz especial pois só tem uma dimensão comprimento n, mas, pode ser orientado em linha (matriz 1n) ou em coluna (matriz n1) O Matlab tem duas funções para determinar essas dimensões size e length. A função size dá o valor de cada dimensão. A função length dá a maior das dimensões. Exemplo: a=rand(3,2); d=size(a), c=length(a) Resultado: rand(3,2) gera uma matriz aleatória 3 2; d=[3 2];c=3. iniciados Os "arrays" podem ser iniciados com: o editor de arrays, instruções de atribuição; instruções de input ( pág. 21 ); leitura de ficheiros ( pág. 40 ). Operador [ ] ( concatenação ) linhas colunas Este operador de concatenação é usado para construir matrizes e arrays. Uma matriz é representada pelos seus elementos ordenados por linhas dentro de parêntesis rectos [], as linhas são separadas por ponto e vírgula ; ou enter e os elementos por linhas separados por espaços ou vírgulas,. (O array pode ter mais do que 2 dimensões). Exemplos: 1. [-2.5] escalar = matriz 11 (neste caso não é preciso parêntesis) 2. [1,2,3] vector linha = matriz 13 3. [1;2;3] vector coluna = matriz 31 4. [1,2;3 4;5,6] matriz 32 5. [] matriz vazia (dimensão 00) 6. [1,2;3] ERRADO, não é uma matriz Todas as linhas têm o mesmo número de elementos e todas as colunas têm o mesmo número de elementos Computação 10
ajustável A dimensão da matriz não é fixa. Se for necessário ela é modificada para conter um novo elemento definido por atribuição, aos outros elementos necessários para completar a matriz são-lhes atribuídos o valor zero. Pode usar-se expressões para definir os elementos. Não se pode usar nas expressões elementos de arrays que ainda não tenham sido criados Pode usar-se arrays para definir novos arrays desde que fiquem definidos todos os elementos do array. Exemplos: 1. a=[6-3 -2], a(4)=5, b=[a(3) -2 a] 2. n=length(a) 3. a(5) ERRADO o comprimento de a é 4 4. c=-2 5. c(3,2)=6 6. [m1,n1]=size(c) 7. c(4,3)=12 8. [m2,n2]=size(c) 9. d=[c c;b] Operador : ( colon operator ) início : incr : fim Gera uma sucessão de valores, em linha, com incremento de incr em que o primeiro é igual a início e o último não ultrapassa fim. Se incr=1 pode ser omitido. ( incr > 0 início > fim ) ( incr < 0 início < fim ) matriz vazia [] Exemplos: 1. a=[1 2 3 4 5], b=[1:5], c=1:5, d=(1:5) 2. x=0:0.01:5; 3. xx=(0:-1:5) (Resultado: xx = Empty matrix: 1-by-0) Se quiser uma sequência com um número fixo de elementos use a função linspace Computação 11
Operador ' ( transpose operator ) Transforma as linhas de qualquer matriz em colunas e as colunas em linhas. Exemplos: 1. f=[1:5]', a=1:5 2. g=[f';f'] 3. h=[a', a'], k=[f, f] Iniciação de matrizes usando funções internas ( built-in functions ) Função zeros(n) zeros(m,n) Comentários Gera uma matriz nn só com zeros Gera uma matriz mn só com zeros ones(n) Gera uma matriz nn só com 1 ones(m,n) Gera uma matriz mn só com 1 eye(n) eye(m,n) rand(n) rand(m,n) Gera a matriz identidade (I) nn Gera uma matriz mn (só com zeros e 1 nos elementos com índice (i,i)) Gera uma matriz aleatória nn com valores igualmente distribuídos entre 0 e 1 Gera uma matriz aleatória mn com valores igualmente distribuídos entre 0 e 1 Exemplos: 1. a=ones(3,2) 2. b=[a, zeros(3),a] 3. c=eye(size(b)); 4. d=rand(2) Computação 12
Operações com matrizes Adição de matrizes + compatíveis As matrizes A e B têm que ter a mesma dimensão, isto é, ambas com m linhas e n colunas C mn ( C corpo dos complexos ) C=A+B, cij = aij + bij i=1,...,m, j=1,...,n C é uma matriz com m linhas e n colunas (C mn ). Multiplicação por um escalar Seja um escalar C e B uma matriz com m linhas e n colunas C mn. C= B, cij = bij i=1,...,m, j=1,...,n C é uma matriz com m linhas e n colunas C mn. Exemplos: 2 3 3 3 1 6 2 3 4 6 2 1 6 4 0 3 6 1 6 2 12 Multiplicação de matrizes compatíveis O número de colunas da primeira matriz têm que ser igual ao número de linhas da segunda matriz. Seja A uma matriz C mk e B uma matriz C kn C A B, c ij k a b 1 i j i 1,..., m, j 1,..., n C é uma matriz com m linhas e n colunas C mn. Computação 13
Computação 14 Exemplos: 4 14 17 2 7 2-0 3 2 2 4 3 1) ( 2 3) ( 3 4 2 0 2 2 1 4 2 1) ( 1 3) ( 2 4 1 0 4 3 2 1 4 3 2 2 1 3 2 1 9 6 3 0 0 0 3 1 2) ( 1 1 1 3 3 2) ( 3 1 3 3 0 2) ( 0 1 0 3 2 1 1 3 0 3 1) ( 3 3) ( 2) ( 0 1 1 3 0 3 2 1 Operações com matrizes em MATLAB adição de matrizes + subtracção de matrizes - multiplicação de matrizes * Se um dos operandos for um escalar, * é o produto da matriz por um escalar exponenciação de matrizes ^ (a matriz é quadrada) Se o expoente k for inteiro é o produto de k matrizes todas iguais; se o expoente é inteiro negativo (-k) é o produto de k matrizes iguais à inversa A -1 - associada à aplicação inversa; para outros valores do expoente o cálculo é mais complicado (ver em help). Divisão / ou \ Equivale a multiplicar respectivamente à direita ou à esquerda pela inversa A -1. Se a matriz não for quadrada as operações são mais complexas (pode ver em help [ Contents ] - Matlab - Mathematics - Matrices and Linear Álgebra - Solving Linear Systems of Equations).
Exemplo: Para resolver o sistema Ax=b basta fazer: A=[2 3 1;-1 2 3;0 2 1]; b=[1;-4;-1]; x=a\b Resultado: x = 1 0-1 Transposta.' C=A.' cij = aji i=1,...,m; j=1,...n Se AC mn, CC nm Exemplos: a=[1 1+i 1-3i]; a.' Resultado: ans = 1.0000 1.0000 + 1.0000i 1.0000-3.0000i b=[2-1;6 4;3 1]; b.' Resultado: ans = 2 6 3-1 4 1 Transconjugada ' C=A', cij = a ji i=1,...,m; j=1,...n onde a é o conjugado de a. Exemplos: a=[1 1+i 1-3i]; a' Resultado: ans = 1.0000 1.0000-1.0000i 1.0000 + 3.0000i b=[2-1;6 4;3 1]; b' Resultado: ans = 2 6 3-1 4 1 c=[2+i -1+i;6 4-i]; c' Resultado: ans = 2.0000-1.0000i 6.0000-1.0000-1.0000i 4.0000 + 1.0000i Computação 15
Operações com arrays ( elemento por elemento ) Nas operações com arrays os elementos correspondentes são operados entre si. C=A op B c ij = a ij op b ij i,j compatíveis Logo só são possíveis se os arrays tiverem a mesma dimensão. (Excepção: quando um dos operandos for um escalar, ele é sempre operado com os elementos do outro array) Exemplos: Seja A=[20, 30, 40]; B=[4, 2, 5]; c=10 Adição ( subtração ) de arrays +( - ) (= matrizes) 1. A+B = [20+4, 30+2, 40+5]= [24, 32, 45] 2. A - c = [20-10, 30-10, 40-10]= [10, 20, 30] Multiplicação de arrays.* 1. A.*B = [20*4, 30*2, 40*5]= [40, 60, 200] 2. A.*c=A*c=c*A=[20*10,30*10,40*10]=[200,300,400] Divisão de arrays./ ou.\ 1. A./B=[20/4, 30/2, 40/5]=[5, 15, 8] 2. A.\B=[20\4, 30\2, 40\5]=[0.2, 0.066667, 0.125] 3. A./c=A/c=[20/10, 30/10, 40/10]=[2, 3, 4] 4. c./a=[10/20,10/30,10/40]=[0.5,0.3333,0.25] ( c/a) Exponenciação de arrays.^ 1. A.^B=[20^4,30^2,40^5]=[160000, 900, 102400000] 2. A.^c=[20^10,30^10,40^10]= =[ 1.024e+013, 5.9049e+014, 1.0486e+016] ( A^c) 3. c.^b=[10^4, 10^2, 10^5]=[ 10000, 100, 100000] Computação 16
Outros exemplos As expressões seguintes não são válidas. Diga porquê. 1. A^c (A não é quadrado) Resultado:??? Error using ==> ^ Matrix must be square. 2. A.* B' (A e B não têm a mesma dimensão) Resultado:??? Error using ==>.* Matrix dimensions must agree. (= A./B'=A'.^B=c/A=...) 3. disp([' matriz ', int2str(a')]) Resultado:??? Error using ==> horzcat All matrices on a row in the bracketed expression must have the same number of rows. A função disp ( pág 24 ), permite escrever arrays no command window. A função int2str ( =integer to string ) permite transformar inteiros em strings ( pág 25 ). O string é um array de caracteres, um elemento por cada carácter. Logo na instrução anterior estamos a tentar concatenar um array (1 8), matriz+2 espaços, com um array ( 3 1 ), A, o que é dimensionalmente incompatível. Exercícios: 1. Tabele a função f(x)=x 2 +1/x 3 para x=1:0.1:2. 2. Dados 2 pontos (x,y,z)r 3 determine a distância cartesiana dada por: d 2 2 x x y y z 2 1 2 1 2 1 z2 Que modificações tem de fazer para trabalhar em R n? Computação 17
Subarrays Para obter um subarray basta indicar dentro de parêntesis curvos a seguir ao nome a lista de índices que formam o subarray. Exemplos: Seja v=[1,3,5,6], vlog=logical([1,0,1]) um vector lógico e A= 6 3 1 1 0 4 orientação 1. v(2:4) representa a 2ª até à 4ª componente de v orientadas do mesmo modo que v ( =v((2:4) ) ). 2. v(:) vector coluna com todas as componentes de v. 3. A(:,3) representa a 3ª coluna de A. 4. A(:,[1 2]) representa a 1ª e 2ª coluna de A. 5. A(2,:) representa a 2ª linha de A. 6. A(:,end) representa a última coluna de A. 7. A(end,:) representa a última linha de A. 8. v(end) representa a última componente de v. 9. A(3) é a 3ª componente de A com os elementos ordenados por colunas (neste caso =A(1,2)) 10. A(:) vector coluna com todos os elementos de A ordenados orientação por colunas ( =A((1:end) ) A(1:end) orientados segundo a lista ). NOTA: end só é reconhecido quando representa um índice ( dentro de parêntesis ( ) ) repete 11. A(:,[1 1 1]) cria uma matriz com 3 colunas iguais à 1ª coluna de A. 12. A(:,3:-1:1) representa toda a matriz mas com as colunas por ordem inversa (3ª,2ª,1ª). ( A não é modificado ) 13. B=A(:,2) B é um vector coluna com a 2ªcoluna de A. Computação 18
elimina 14. A(:,1)=[ ] apaga a 1ª coluna. ( A passa a ser um array 22 ) 15. A(:,vlog) representa a 1ª e a 3ª coluna correspondente às componentes verdadeiras de vlog. 3 1 16. A([2 3;4 5]) representa a matriz 22 1 0 Coloca os elementos correspondentes de A(:) segundo a disposição da lista. Neste caso a lista é um array bidimensional. Exercícios: 1. Dada uma matriz A aleatória 35 determine a matriz: a. com a 1ª coluna trocada com a última; b. com as colunas permutadas circularmente e a última coluna em primeiro lugar; c. com a 3ª coluna em primeiro lugar por permutação circular com a 1ª e a 2ª; d. com as linhas permutadas circularmente e a 1ª linha em último lugar; 2. Dada a matriz 4.1 B 6.1 3.1 3.2 3.4 5.3 1.1 0.1 0.4 0 2.7, qual o resultado 1.3 das instruções: a. B([1,3],1:2:4); b. c=[1:3:10];d=c+b(2,:); e=c.*b(2,:); f=c*[b(:,3);0.1] Computação 19
Funções que operam por colunas (linhas) Há funções que normalmente são usadas para operar com listas, por exemplo : max; min; mean; sort; sum; prod; cumsum; cumprod. Quando o argumento é um array com mais do que uma dimensão o Matlab considera que têm uma colecção de listas. Por omissão, estas funções trabalham variando mais rapidamente o índice da primeira dimensão diferente de 1. Isto é, se for um vector ( matriz linha ou coluna = 1 lista ) opera com todos os elementos, se for uma matriz opera segundo as colunas, o resultado é um vector linha, com um elemento por cada coluna. No entanto, estas funções têm um parâmetro que permite escolher qual o índice que varia mais rapidamente. Exemplos: Seja x=(1:5:20) e A=[1:3;4:6] 1. a=sum(x) soma todos os elementos de x Resultado: a 34; 2. b=sum(a) soma os elementos de cada coluna de A Resultado: b [ 5 7 9] ( vector linha ); 3. c=sum(a,2) soma os elementos de cada linha de A Resultado: c [ 6; 15] (vector coluna); 4. d=sum(a(:)) soma todos os elementos de A Resultado: d 21; 5. A(1,2)=9; d=max(a) maior elemento de cada coluna Resultado: d [4 9 6]; 6. A(1,2)=9; [f1 f2]=max(a) f1-maior elemento de cada coluna; f2 índice da linha desse elemento em A Resultado: f1[ 4, 9, 6] f2[ 2, 1, 2] 7. A(1,2)=9;rand('state',10); g=max(a,rand(2,3)*10) g - matriz com o maior elemento dos elementos correspondentes de cada matriz ( A e rand(2,3)*10 ) Resultado: g [4.4928 9.6408 3; 4 5 6] 8. f=max(a,[],2) f- maior elemento de cada linha de A ([]?) Resultado: f[ 3; 6] ( vector coluna ) Em MATLAB é comum usar [ ] para definir parâmetros de funções que não vão ser usados. Computação 20
Instruções de entrada e saída (input/output) Iniciar variáveis com input Var_a_iniciar = input (' texto ') ou Var_a_iniciar = input (' texto ','s') Quando a função input é executada, é escrito, no Command Window, o conjunto de caracteres texto, e o Matlab aguarda que o utilizador responda. A informação introduzida é armazenada na variável Var_a_iniciar. No texto pode aparecer um ou mais \n ( = mudar de linha ). Qual a informação introduzida? Com a primeira instrução pode ser: uma expressão cujo resultado é armazenado; uma matriz definida com [ ]; um "string" definido entre '; enter ( ) e é armazenada uma matriz vazia. Com a segunda instrução pode ser: quaisquer caracteres e é armazenado o "string" formado por esses caracteres; enter ( ) e é armazenado um "string" vazio. Exemplos: 1. var1=input (' Introduza os dados: '); Introduza os dados: 3.14 ( = enter) Resultado: var1=3.14 matriz 11 2. var2=input (' Introduza os dados: ','s'); Introduza os dados: 3.14 Resultado: var2='3.14' array de caracteres 14 Computação 21
3. var3=input (' Introduza os dados: '); Introduza os dados: '3.14' Resultado: var3='3.14' array de caracteres 14 4. var4=input (' Introduza os dados:\n'); Introduza os dados: [2*3, 5, 2] Resultado: var4=[6 5 2] matriz 13 5. var5=input (' Introduza os dados: '); Introduza os dados: Resultado: var5=[] matriz 00 6. var6=input (' Introduza os dados: ','s'); Introduza os dados: Resultado: var6='' array de caracteres 00 O Matlab também permite iniciar variáveis a partir de ficheiros. Vamos utilizar apenas a instrução load ( pag. 41 ) mas existem também as funções fscan, fread e fopen que são muito úteis. Saída de dados (Output). Em Matlab há vários processos de escrever os resultados (output), permitindo controlar, de algum modo, o aspecto com que essa informação é escrita. Os mais simples são: 1. Instruções sem ; ; 2. Função disp; 3. Função fprintf. Controlar o formato Apesar de internamente o Matlab trabalhar com um número em vírgula flutuante, no sistema binário, que, por omissão, é armazenado em 8 bytes, consegue distinguir o tipo de constante que armazena. Quando mandamos escrever ( por exemplo, no Command Window ) o conteúdo da variável que identifica essa posição de Computação 22
memória, esse conteúdo é transformado em algo que entendemos e que vai depender do formato que escolhemos e do tipo de variável que temos que escrever. Os tipos mais comuns são: Inteiros - números sem parte decimal. Exemplos: 123456789; -254 Reais vírgula fixa números só com ponto decimal, para números não muito grandes nem muito pequenos. Exemplos: -34.658739; 389.6534; 0.0123 Reais vírgula flutuante números escritos na notação científica. Exemplos: -1.0356e-16; 0.367E-5; 657.1290e+5 Complexos real + real i Caracteres os caracteres Windows 1252. Exemplos: abcdefgh; a12bc0 Estes são os tipos de variáveis por omissão. Pode utilizar-se outro tipo de dados desde que se declarem com, por exemplo, int8, int16, int32, int64, single,. I. Formatos ( para números ) O número aparece convenientemente arredondado format short ou format ( por omissão) escreve o resultado não inteiro com 4 casas decimais ( se > 0.001 e < 1000 em vírgula fixa; caso contrário em vírgula flutuante com 5 algarismos significativos ( * ) ) Exemplos: 999.1100; 9.0011e+003; 0.0010; 1.0000e-004 format long escreve o resultado com 15 casas decimais (se > 0.001 e < 100 em vírgula fixa; caso contrário em vírgula flutuante com 16 algarismos significativos) Exemplos: 99.99000000000000; 0.00100000000000; 9.999900000000000e+002; 9.000000000000000e-004 ( * ) Algarismos significativos são todos os dígitos com excepção dos zeros para obter a casa das unidades (normalmente os zeros à esquerda). Computação 23
format short e escreve o número em vírgula flutuante com 5 algarismos significativos (e 4 casas decimais) Exemplos: 9.9990e+001; 1.0000e-003 format long e escreve o número em vírgula flutuante com 16 algarismos significativos ( e 15 casas decimais ) Exemplo: 9.999000000000000e+001 format short g escreve o número não inteiro com, no máximo, 5 algarismos significativos ( se 10-4 e < 10 5 em vírgula fixa; caso contrário em vírgula flutuante ) Exemplos: 99.99; 0.00098765; 9.9e-005; 99900; 9.99e+005 format long g escreve o número com, no máximo, 16 algarismos significativos (se 10-4 e < 10 16 em vírgula fixa; caso contrário em vírgula flutuante) Exemplos: 99.99; 9.9e-005; 987654321098765; 1e+016; 0.0009876543 Ver também: format bank, format hex, format rat, format + Se os números forem complexos, funciona de modo idêntico, com algumas particularidades que podem aprender quando necessitarem. II. Formatos (para espaçamentos): format compact escreve a informação em linhas sucessivas format loose ( por omissão) escreve a informação com linhas de intervalo Função disp disp( array ) escreve os elementos de array ( todos do mesmo tipo ) no Command Window. Se se quiser escrever texto, o array tem que guarda um "string" com esse texto. Computação 24
Se se quiser escrever texto e números, tem que se converter os números em "string" ( funções num2str e int2str ) e formar um array com o texto e o "string" do número. Exemplos: 1. disp (rand(2)); (escreve com a precisão de format) 2. disp ([' O valor de Pi = ',num2str(pi)]) Resultado: O valor de Pi = 3.1416 3. disp([' O valor de Pi =',num2str(pi,10)]) Resultado: O valor de Pi =3.141592654 ( usou os 10 dígitos do parâmetro ) 4. disp ([' O valor de Pi = ',int2str(pi)]) Resultado: O valor de Pi = 3 (converte a parte inteira em caracteres, usa o número necessário de caracteres) 5. A=1:3;disp([' matriz ', int2str(a)]) Resultado: matriz 1 2 3 6. A=1:3;disp([' matriz ', int2str(a')]) Resultado:??? Error using ==> horzcat All matrices on a row in the bracketed expression must have the same number of rows. Função fprintf Esta função permite escrever simultaneamente "strings" e números. No entanto só escreve a parte real de um número complexo. Tem a forma: fprintf (format, resultados) onde resultados é uma lista de expressões separadas por (,), a escrever no Command Window e format é um "string" contendo o texto a ser escrito e os chamados caracteres de conversão ( Linguagem C ). Computação 25
Sinal (s) controlo Formato (c) MATLAB Os caracteres de conversão de formato também podem especificar o número de caracteres a usar na escrita da informação %sm.n c onde m é o número mínimo de caracteres a ser usado na escrita do valor da variável com o formato c e n é o número de dígitos a seguir ao ponto decimal ( m e.n podem ser eliminados ). Alguns caracteres de conversão, controlos de escrita do texto e valores possíveis para s são indicados na seguinte tabela. Carácter Descrição %d Escreve um inteiro ( ignora-o se não for inteiro ) %f Escreve um real em vírgula fixa com 6 casas decimais %e Escreve um real em vírgula flutuante com 6 c.d. %g Escreve na forma mais compacta de %e ou %f. Não escreve os zeros fracionários à direita. %s Escreve um "string" \n Salta para a nova linha \t Tabelamento ( de 4 em 4 caracteres ) \\ ou ou %% Nestes casos, repetem-se os caracteres para que apareça uma vez no texto. - Encosta o valor à esquerda + Escreve o sinal + ou - do resultado 0 Os espaços são preenchidos por zeros Computação 26
Exemplos: 1. fprintf (' O valor de Pi = %f \n', pi) Resultado : O valor de Pi = 3.141593 2. fprintf (' O valor de Pi = %10.4f \n', pi) Resultado : O valor de Pi = 3.1416 3. fprintf (' O valor de Pi = %10.4e\n', pi) Resultado : O valor de Pi = 3.1416e+000 4. fprintf (' O valor de Pi = %13.4e\n', pi) Resultado : O valor de Pi = 3.1416e+000 5. fprintf (' O valor de Pi = %-13.4e\n', pi) Resultado : O valor de Pi = 3.1416e+000 O string de format tem que estar todo na mesma linha, se for comprido escreva-o como a concatenação de vários strings que podem estar em linhas diferentes. Exemplo: a=2;fprintf(['ensaio '...,'%d\n'],a) Resultado : ensaio 2 Se uma das variáveis a escrever for não escalar a função fprintf vai considerar que a lista a escrever é constituída por todos os elementos da variável ordenados por coluna e vai repetir o format até que todos os elementos da lista sejam escritos. Exemplo: Calcule o valor de z = cos (x y) para diferentes valores de x e y ( x e y são vectores com a mesma dimensão ). Resolução: % calculo de f(x,y) ( isto é um comentário ) x=input(' valor de x? '); y=input(' valor de y? '); z=cos(x.*y); z=[x;y;z] fprintf(' valor de f(%g,%g)= %g \n',z) Computação 27
Execução 1 Execução 2 valor de x? [2 3 4] valor de y? [-1.1 3 1.5] valor de x? 2.3 valor de y? -3 z = 2.0000 3.0000 4.0000-1.1000 3.0000 1.5000-0.5885-0.9111 0.9602 valor de f(2,-1.1)=-0.588501 valor de f(3,3)= -0.91113 valor de f(4,1.5)= 0.96017 z = 2.3000-3.0000 0.8157 valor de f(2.3,-3)=0.815725 Se se pretender escrever para um ficheiro pode usar-se instruções da forma: idf=fopen(nome_ficheiro, modo) fprintf (idf, format, resultados) fclose(idf) A função fopen abre um ficheiro permitindo que o programa dialogue com ele. Tem como argumentos o string com o nome do ficheiro e o string com o modo como o dialogo se processa. Para escrita pode ser: 'w' só escreve criando o ficheiro ou apagando o ficheiro antigo se existir; 'a' só escreve criando o ficheiro ou acrescentando a nova informação ao ficheiro antigo se existir. Se se acrescentar um + ('w+', 'a+') também pode ser usado para leitura. O identificador do ficheiro vai ser idf. A função fprintf é a mesma que foi descrita anteriormente, apenas tem como primeiro argumento o identificador do ficheiro idf. A função fclose fecha o ficheiro identificado por idf. Devolve o valor 0 se for bem sucedido ou -1 se não for bem sucedido. Exemplo: % calculo de f(x,y) ( isto é um comentário ) x=input(' valor de x? '); y=input(' valor de y? '); z=cos(x.*y); z=[x;y;z] fi1=fopen('res.txt','w') fprintf(fi1,' valor de f(%g,%g)= %g \n',z); fclose(fi1) E é criado, no directório corrente, o ficheiro res.txt com o resultado. Computação 28
Ficheiros.m Quando os programas começam a ser maiores torna-se impraticável executar as instruções de modo interactivo no Command Window. Há toda a vantagem em armazenar os comandos num ficheiro que possa ser chamado para ser executado várias vezes e que possa ser editado, para facilmente emendar possíveis erros. O Matlab utiliza a extensão.m para identificar esses ficheiros, os chamados ficheiros.m, que podem ser de dois tipos distintos, os scripts e as funções ( pág 42 ). Script chamado Um ficheiro script armazena instruções MATLAB que partilham o Workspace do Command Window. É executado quando se escreve o seu nome sem a extensão.m ( obtém-se o mesmo efeito se se copiar as instruções para o Command Window ). A transferência da informação é feita através do nome das variáveis. O script termina quando encontra a instrução return ou o fim do script. Os comentários são precedidos do carácter % e são ignorados pelo interpretador. Exemplo: Escreva um script para resolver o exercício 2 da página 17. Ficheiro "Exerdistan.m" Execução 1 % exercicio 2 distancia p1=input('primeiro ponto='); p2=input('segundo ponto='); dist=sqrt(sum((p1-p2).^2)); disp(['distancia = ',... num2str(dist)]); >> Exerdistan Primeiro ponto=[3 5 9] Segundo ponto=[-1 4 7] distancia = 4.5826 >> Assim é fácil repetir a execução do programa com outros dados. Execução 2 >> Exerdistan Primeiro ponto=[2 5-1 7 6] Segundo ponto=[1 0 4-5 2] distancia = 14.5258 Computação 29
Programação Salto condicional - Instrução IF If... end Matlab falso exp 1 verdadeiro instruções 1 if exp 1 instruções 1 end instruções 2 instruções 2 Começa por analisar o valor lógico de exp 1. Se for verdadeiro executa as instruções 1 e, depois, as instruções 2. Se for falso executa apenas as instruções 2. Se o resultado de exp 1 for um array só é considerado verdadeiro se todos os elementos forem diferentes de zero. If... else... end falso exp 1 verdadeiro instruções 2 instruções1 Matlab if exp 1 instruções 1 else instruções 2 end instruções 3 instruções 3 Começa por analisar o valor lógico de exp 1. Se for verdadeiro executa as instruções 1 e, depois, as instruções 3. Se for falso executa as instruções 2 e, depois, as instruções 3. Computação 30
If... elseif... else... end exp 1 falso exp 2 falso exp n falso verdadeiro verdadeiro verdadeiro instruções 1 instruções 2 instruções n instruções n+1 instruções n+2 Matlab (melhor alternativa) if expressão 1 instruções 1 elseif expressão 2 instruções 2 elseif... elseif expressão n instruções n else instruções n+1 end instruções n+2 (pior alternativa) if expressão 1 instruções 1 else if expressão 2 instruções 2 else if expressão n instruções n else instruções n+1 end end end instruções n+2 Esta instrução pode ter vários elseif e apenas um else que é opcional. Computação 31
Exemplo: Dados x e y calcular f(x,y). f(x,y) 2 x y cos (x y) x y y 0 e x 1 y 0 e x 1 nos restantes casos Fluxograma ler x,y y > 0 sim x < 1 sim não não z x y z cos (x y) z x 2 y escrever z Matlab % calculo de f(x,y) x=input(' valor de x? '); y=input(' valor de y? '); if ~(y>0) z=abs(x)+abs(y); elseif x<1 z=sqrt(x^2+y); else z=cos(x*y); end fprintf(' valor de f(%g,%g)= %g',x,y,z) Computação 32
Funções Lógicas Há funções lógicas que facilitam a escrita da expressão i anterior. Algumas delas são referidas a seguir: any - é verdadeiro se algum dos elementos da lista for diferente de zero (opera por colunas, ver pág.20). Exemplo: any([0 1 0]) 1 all - é verdadeiro se todos os elementos da lista forem diferentes de zero (opera por colunas, ver pág.20). Exemplo: all([1 2-1]) 1 find - fornece um vector com os índices dos elementos diferentes de zero orientados do mesmo modo que o parâmetro. Nos arrays, considera para parâmetro, o vector coluna com os elementos do array ordenados por colunas. Exemplo: find([0 3 0;2 0 3]) [2 3 6]' find([1 0 2]) [1 3] isfinite - dá um array com 1 onde os elementos são finitos e zero nos restantes. Exemplo: isfinite([0 3 inf;2 NaN 3]) [1 1 0;1 0 1] isnan - dá um array com 1 onde os elementos são "NaN" e zero nos restantes. Exemplo: isnan([0 3 inf;2 NaN 3]) [0 0 0;0 1 0]; isinf - dá um array com 1 onde os elementos são "inf" e zero nos restantes Exemplo: isinf([0 3 inf;2 NaN 3]) [0 0 1;0 0 0]; ischar - dá 1 se o array for de caracteres Exemplos: ischar([0 3 inf;2 NaN 3]) 0; ischar(['abc','de']) 1 isempty - dá 1 se o array é vazio Exemplo: isempty([]) 1; isnumeric- dá 1 se o array é numérico Exemplo: isnumeric([0 3 inf;2+i NaN 3] 1; isreal - dá 1 se todos os elementos do array não tiverem parte imaginária Exemplo: isreal([0 3 inf;2 NaN 3]) 1; Computação 33
Ciclo for for variável = expressão instruções 1 end instruções 2 O grupo de instruções 1 é repetido tantas vezes quantos os valores que variável toma. Os valores que variável toma são as colunas de expressão. O caso mais comum é expressão ser uma sequência, definida pelo operador :, do tipo ni:s:nf. Se expressão for o array vazio as instruções 1 nunca são executadas. Se se quiser sair do ciclo sem o completar pode usar-se a instrução break. Se se quiser passar para o próximo valor da variável sem completar o bloco de instruções pode usar-se a instrução continue. Exemplo: Considere o seguinte "script" %ficheiro "exfor.m" n=0; for k=fl end n n=n+1; k Execuções: 1. fl=1:2:10; exfor Resultado: k=1;k=3;k=5;k=7;k=9; n=5; 2. fl=[1:2:10]'; exfor Resultado: k=[1;3;5;7;9]; n=1; 3. fl=[1 2; 3 4]; exfor Resultado: k=[1;3];k=[2;4]; n=2; 4. fl='abc'; exfor Resultado: k=a;k=b;k=c; n=3; 5. x=[2 1 3 5 7]; fl=find(x<0); exfor Resultado: k=2;k=4;n=2; Computação 34
Exemplos: 1. Escreva um programa que, dado um vector, faça a soma dos elementos e conte os positivos. Pseudocódigo leia x (vector ) n comprimento de x inicie soma 0 npos 0 para i 1:n soma soma + x(i) se x(i)>0 npos npos+ 1 escreva npos, soma Matlab x=input(' vector= '); n=length(x); soma=0;npos=0; for i=1:n soma=soma+x(i); if x(i)>0 npos=npos+1; end end fprintf(['o vector tem %d'...,' numeros positivos e \n'...,'a soma é %e '],npos, soma); 2. Escreva um programa que, dado um vector, faça o mesmo que a função "find". Pseudocódigo leia x (vector ) n comprimento de x inicie nind 0 para i 1:n se x(i) 0 nind nind+1 v(nind) i escreva v Matlab x=input(' vector= '); n=length(x); nind=0; for i=1:n if x(i)~=0 nind=nind+1; v(nind)=i; end end v Ciclo while while expressão instruções 1 end O grupo de instruções 1 é repetido um número indefinido de vezes enquanto todos os elementos de expressão forem diferente de zero. A expressão tem que ser real. Se se quiser sair do ciclo sem o completar pode usar-se a instrução break. Se se quiser passar para o próximo valor da variável sem completar o bloco de instruções pode usar-se a instrução continue. Computação 35
Exercício (5.21): Sabendo que π 4 1 1 3 1 5 1 1 i i0 2i 1 escreva um programa que calcule uma aproximação de somando os termos até que o valor de um termo seja <10-5. Pseudocódigo i 0 ui 1 soma 0 enquanto ui 10-5 soma soma +ui i i+1 ui (-1) i.(1/(2i+1)) escreva i, soma*4 Matlab i=0; ui=1; soma=0; sinal=1; while abs(ui)>=1.e-5 soma=soma+ui; i=i+1; sinal=-sinal; ui=sinal*(1./(2*i+1)); end fprintf([' Ao somar %d',... ' termos obteve-se pi= '... '%g'],i,4*soma); Estrutura switch Permite ramificar alguns casos especiais de modo mais claro do que o if. Tem a forma switch expressão switch case expr case 1 instruções 1 case { expr case 2 1,..., expr case 2 m } instruções 2... otherwise opcional instruções n end instruções n+1 onde expressão switch pode ser um escalar ou um "string". A expressão switch é comparada sucessivamente com as expressões case i até encontrar uma ( case k ) igual, então vai executar as instruções k e depois instruções n+1. Se não Computação 36
encontrar nenhuma igual executa as instruções n ( se existir otherwise ). No caso anterior, para que as instruções 2 sejam executadas, basta que expressão switch seja igual a uma das expressões case 2 i. Nesse caso, o que está à frente de case é um array de células ( em Matlab - Getting Started - Programming - Other Data Structures - Cell Arrays ou no Anexo 2 pág 75) identificado pelas chavetas {} que agrupam os elementos ( arrays ). Só nesta situação é que vamos usar arrays de células. Notar que: só um dos blocos é executado; se expressão for um "string" as letras maiúsculas são diferentes das minúsculas e os espaços também são comparados. Exercício 5.10 Escreva um programa em Matlab que leia o número de um mês e de um ano e determine quantos dias tem esse mês Resolução % 5.6 com switch mes=input (' mes '); ano=input(' ano '); switch mes case {1,3,5,7,8,10,12} dias=31; case {4,6,9,11} dias=30; case 2 if(mod(ano,4)==0 & mod(ano,100)~=0)... mod(ano,400)==0 dias=29; else dias=28; end otherwise disp([' nao existe o mes ',int2str(mes)]) return end disp(['o mes ', int2str(mes), ' tem ',... int2str(dias),' dias']) Computação 37
Ficheiros Matlab Ficheiros de dados O Matlab permite "dialogar" com os ficheiros de dados de vários modos. As instruções save e load são das mais simples e servem, respectivamente, para escrever ( output ) e ler ( input ) a informação de um ficheiro. Save Guarda variáveis do workspace num ficheiro. É da forma: save nome_ficheiro lista_variáveis opções onde lista_variáveis é constituída pela lista de variáveis separadas por espaços que vão ser guardadas no ficheiro nome_ficheiro. Se lista_variáveis for omitida todas as variáveis do Workspace são guardadas. As opções especificam o formato com que as variáveis são armazenadas. Vamos dar as seguintes ( pode ver help save ): Opção -mat ( por defeito) -append -ascii -ascii -double Efeito Formato binário Formato binário, acrescenta no fim. Formato ASCII com 8 dígitos Formato ASCII com 16 dígitos Com as opções mat e append o nome do ficheiro não precisa de ter extensão. O Matlab guarda no ficheiro nome_ficheiro.mat, isto é, acrescenta a extensão.mat se ela não existir. Matlab guarda a informação dos ficheiros.mat numa forma compacta podendo conter várias variáveis. Os nomes das variáveis são mantidos, assim como os seus tipos e as suas dimensões. Estes ficheiros só podem ser lidos pelo Matlab. Computação 38
Se só escrever save a informação de todo o workspace é omisso armazenada no ficheiro matlab.mat. Se usar as opções ascii o nome_ficheiro pode e deve já nome conter uma extensão sugestiva ( por ex:.dat ). Os ficheiros ascii não guardam a informação acerca das variáveis, guardam apenas os valores numéricos, dos elementos ordenados por linhas, separados por espaços e as linhas separadas por return/enter. Se se guardar mais do que uma variável, quando o ficheiro for de novo lido, com a instrução load ( à frente ), o Matlab interpreta-a como uma única variável ( deve ter o mesmo número de elementos por linha ). Estes ficheiros podem ser editados por qualquer editor. Se não quiser guardar o ficheiro na directoria corrente, nome_ficheiro deve ser o nome completo ( inclui o path para a directoria onde quer guardar o ficheiro ). A instrução save também pode ter o aspecto save ( 'nome_ficheiro ', 'var1', 'var2',..., 'opcões') onde save é uma função cujos argumentos são "strings". O Matlab aceita que a lista de variáveis seja abreviada com o símbolo * para substituir qualquer número de letras. Por exemplo: v* representa todas as variáveis começadas por v. Exemplos: 1. save fich1 2. save fich2 a b 3. save fich.dat a ascii 4. save ('fich2', 'b', 'c', 'd', '-append') 5. save ('..\Pc\fichdados\matA.dat', 'mata',... '-ascii') Computação 39
Load Carrega para o workspace as variáveis guardadas no ficheiro. É de uma das forma: load nome_ficheiro load nome_ficheiro opções load nome_ficheiro lista_variáveis opções Se nome_ficheiro não tiver extensão o Matlab começa por procurar o ficheiro nome_ficheiro.mat, criado pela instrução save, que deve estar no formato binário para carregar todas as variáveis que o ficheiro contém. Neste caso, pode escolher-se de entre as variáveis armazenadas no ficheiro aquelas que se pretendem carregar, indicando-as em lista_variáveis. Essa lista, tal como em save, tem os nomes das variáveis separados por espaços. Se nome_ficheiro tiver uma extensão diferente de.mat o Matlab lê o conteúdo do ficheiro que deve conter apenas uma variável, em formato ASCII. Se se usar opções pode-se forçar o formato do conteúdo do ficheiro independentemente da sua extensão. Se opção = -mat, o nome_ficheiro não precisa de ser escrito com a extensão.mat. Se opção = -ascii o conteúdo do ficheiro deve ser numérico nome a variável que é lida é armazenada em 8 bytes ( 16 algarismos significativos), independentemente do modo como é escrita. Pode também conter comentários (linhas iniciadas por %) que são ignorados. Com esta opção, o nome_ficheiro deve ser escrito com a extensão correspondente e a informação nele contida é armazenada numa variável cujo nome é o do ficheiro, sem extensão, substituindo os caracteres não possíveis para nome Computação 40
de variáveis por _. Se o primeiro carácter não for uma letra acrescenta a letra X (maiúscula). A instrução load também pode ter o aspecto var = load ('nome_ficheiro ',..., 'opcões') onde var é o nome da variável que vai armazenar a informação lida. Se var = for omitido, load (...) funciona como os anteriores. (Nota: Se nome_ficheiro for um ficheiro.mat, var não é uma matriz mas sim uma estrutura, que pelo seu interesse, fora do âmbito desta disciplina, é introduzida no Anexo 2, pag. 75 ) Exemplos: 1. load fich1 2. load fich2 b d 3. load fich.dat ascii 4. a=load ('fich.dat'); 5. load ('..\Pc\fichdados\matA.dat', '-ascii') Clear Esta instrução permite apagar toda ou parte da informação que está armazenada no workspace. Permite libertar espaço ocupado por informação que já não é precisa. Exemplos clear clear a c Efeito Todas as variáveis do Workspace são apagadas As variáveis a e c são apagadas do Workspace clear('a', 'c') Como no anterior, mas os nomes das variáveis são "strings" ( a save e load). Computação 41
Funções Uma função é um conjunto de instruções MATLAB, que formam uma unidade que permite executar uma determinada tarefa. É normalmente utilizado para programar algoritmos que podem ser usados na execução de uma grande variedade de problemas aumentando as potencialidades da linguagem Matlab. O utilizador só precisa de saber o que faz e como a chamar para o fazer. Não precisa de saber como é feito. A sua escrita difere de um script, pelo facto da primeira instrução ser do tipo function [argumentos output]=fnome (argumentos input) Com esta instrução são especificados o nome da função fnome e as listas de argumentos de input (opcional), dentro de parêntesis curvos, separados por vírgulas e de argumentos de output (opcional), dentro de parêntesis rectos também separados por vírgulas. Se for um só não precisa de parêntesis []. O nome do ficheiro que guarda a função deve ser o mesmo da função com extensão.m (fnome.m). (Isto porque há comandos MATLAB que olham para o nome da função e outros para o nome do ficheiro). Esse nome, tal como o das variáveis, deve começar por uma letra. A função é executada quando se chama pelo seu nome indicando os argumentos de input e de output. Exemplo: Escreva uma função para resolver o exercício da pág 32. ficheiro "f.m" function z=f(x,y) if ~(y>0) z=abs(x)+abs(y); elseif x<1 z=sqrt(x^2+y); else z=cos(x*y); end Execução >> z=f(2.3,-5) z = 7.3000 >> Computação 42
Transferência da informação Uma função MATLAB tem o seu próprio Workspace, isto é, as suas variáveis só são reconhecidas dentro da própria função. Diz-se que as variáveis são locais. Recebe dados ( input ) através da lista de argumentos input e fornece resultados através da lista de argumentos output. Os argumentos usados na escrita da função dizem-se mudos, pois só ficam definidos quando se manda executar a função e tomam o valor do chamado argumento actual. O endereço do argumento actual é atribuído ao correspondente argumento mudo. No caso dos argumentos input, se o argumento mudo for modificado, por razões de segurança, é feita uma cópia do argumento actual e deste modo as modificações não alteram o valor do argumento actual no programa que chama a função. Para evitar estas cópias, que demoram mais tempo, não deve colocar os argumentos input no primeiro membro de uma instrução de atribuição Exercício: Use a função da página 42 para formar a tabela da função f(x,y) para x=-1:0.4:1 e y=-1:0.5:1 Ficheiro tabela.m ( script ) % tabela de dupla entrada x=-1:0.4:1; y=-1:0.5:1; nx=length (x); ny=length (y); fprintf(['x>y%4.1f%4.1f%4.1f',... '%4.1f%f4.1\n'],y) % tudo na mesma linha e deve ser um espaço T=zeros(nx,ny+1); T(:,1)= x'; for i=1:nx for j=1:ny T(i,j+1)=f(x(i),y(j)); end end fprintf(['%4.1f%6.4f%6.4f%6.4f',... '%6.4f%6.4f\n'], T') Computação 43
Execução: >> tabela x->y -1.0-0.5 0.0 0.5 1.0-1.0 2.0000 1.5000 1.0000 1.2247 1.4142-0.6 1.6000 1.1000 0.6000 0.9274 1.1662-0.2 1.2000 0.7000 0.2000 0.7348 1.0198 0.2 1.2000 0.7000 0.2000 0.7348 1.0198 0.6 1.6000 1.1000 0.6000 0.9274 1.1662 1.0 2.0000 1.5000 1.0000 0.8776 0.5403 NOTAS: O nome de um ficheiro.m não deve ser o de uma variável ou de outro ficheiro.m; caso contrário só um deles é executado, o primeiro que aparecer. O MATLAB dá prioridade às variáveis. Para os ficheiros segue o caminho indicado em path ( exist verifica se o nome já existe; what lista os ficheiros de uma directoria ); Todos os comentários que se escreverem antes da primeira instrução executável ou depois de function, se se tratar dum ficheiro função, aparecem quando se faz help nome do ficheiro ( sem extensão ). A primeira linha de comentários é acedida quando se faz lookfor. Logo a 1ª linha de comentários deve ter uma descrição geral e as restantes um sumário do que é necessário para a sua utilização; Pode-se terminar a função com a instrução end. No entanto, esta instrução é, na maior parte dos casos, opcional. Se se pretender terminar a execução, antes da última instrução da função, deve usar-se a instrução return. Se, durante a execução da função, se pretender escrever alguns avisos ou mensagens de erro pode usar-se, respectivamente, as instruções warning e error. Neste último caso, depois de escrita a mensagem a execução da função termina. Estas instruções têm uma sintaxe semelhante à da instrução disp. No entanto, com estas instruções, as mensagens vêm acompanhadas respectivamente com as indicações: Warning:??? Error Computação 44
Argumentos opcionais As funções MATLAB aceitam argumentos de input e de output opcionais ( ver as funções sum e max, pág. 20). Quando a função é executada, os argumentos actuais são associados por ordem aos argumentos mudos. Se o número for diferente, o MATLAB só transmite a informação dos argumentos actuais. Se eles excederem o número de argumentos mudos, há uma mensagem de erro No caso dos argumentos input, se os argumentos não definidos forem usados nas expressões da função, aparece também uma mensagem de erro. Conforme o número de argumentos de input e/ou output, assim a função pode executar instruções diferentes. Isto é possível porque o MATLAB tem as funções nargin e nargout que contam respectivamente o número de argumentos de input e de output e que podem ser usadas nas instruções da função. Se não usar argumentos de output actuais só o primeiro argumento mudo é associado a ans. No entanto, nargout=0. Exemplo: Ficheiro "soma.m" function [a,b]=soma(c,d) c=c^2; d=d^2; a=c+d; Execuções: 1. >>e=soma(2,3) e = 13 2. >> [e f]=soma(2,3) Warning: One or more output arguments not assigned during call to 'soma'. e = 13 3. >> [e f g]=soma(2,3)??? Error using ==> soma Too many output arguments. 4. >> c=2;da=3; >> e=soma(c,da),c,da e = 13 c = 2 da = 3 As alterações na função não foram transferidas. Computação 45
Outros exemplos Escreva um programa que, dado um vector, faça algo semelhante à função "find" (se tiver um argumento output dá um vector com os índices dos elementos diferentes de zero; se tiver dois, o 2º dá um vector só com os elementos diferentes de zero). Resolução sem nargout: function [vi,vv]=findv(x) % findv determina os elementos diferentes de % zero de um vector %vi=findv(x) - fornece em vi os indices dos % elementos diferentes de zero de x %[vi,vv]=findv(x) - fornece tambem em vv % esses valores diferentes de zero n=length(x); nind=0; for i=1:n if x(i)~=0 nind=nind+1; vi(nind)=i; vv(nind)=x(i); end end Execução: >> x=[1-1 0 0-5]; >> ind=findv(x) ind = 1 2 5 >> [ii,val]=findv(x) ii = 1 2 5 val = 1-1 -5 Computação 46
Resolução com nargout: Na resolução anterior, o vector vv é sempre calculado quer seja pedido quer não. Se se quiser poupar espaço e tempo de execução (vantajoso se n for muito grande), podemos distinguir as duas chamadas anteriores fazendo: function [vi,vv]=findv2(x) % findv2 determina os elementos diferentes % de zero de um vector %vi=findv2(x) - fornece em vi os indices % dos elementos diferentes de zero de x %[vi,vv]=findv2(x) - fornece tambem em vv % esses valores diferentes de zero n=length(x); nind=0; if(nargout==2) for i=1:n if x(i)~=0 nind=nind+1; vi(nind)=i; vv(nind)=x(i); end end else for i=1:n if x(i)~=0 nind=nind+1; vi(nind)=i; end end end Nota: Os resultados seriam exactamente os mesmos, mas na 1ª chamada vv não era calculado. Pode imaginar-se situações mais interessantes de utilização das funções nargin e nargout, como por exemplo, em max. Esta função é uma builtin function, isto é, está compilada e, por isso, não se tem acesso ao ficheiro, no entanto, se fizer type mean pode ver outro exemplo de utilização destas funções. Computação 47
Variáveis globais Vimos anteriormente que existia um workspace diferente associado a cada função. Deste modo não é necessário ter cuidado com o nome que se dá às variáveis, pois não é pelo nome que a transferência de informação é feita, mas sim através dos endereços dos argumentos actuais. O MATLAB permite também partilhar o valor de variáveis que estejam armazenadas na memória global. Essas variáveis ditas globais são criadas quando forem declaradas numa função com a instrução global global var1 var2 var3 Todas as funções que declarem a mesma variável como global estão a partilhar a mesma posição de memória podendo modificá-la. Se o workspace da sessão também a quiser compartilhar também tem que a declarar como global. Essa declaração deve ser feita antes de usar a variável; é de boa norma declará-las antes de qualquer instrução executável e usar, por exemplo, letras maiúsculas para as distinguir. As variáveis globais são bastantes úteis para partilhar variáveis de grandes dimensões cujas situações em que são utilizadas lhes são específicas. O MATLAB cria um workspace com as variáveis globais. Para as apagar deve fazer clear global nome_variável Variáveis Persistentes Quando uma função completa a sua execução, o workspace por ela criado desaparece. Se se pretender manter o valor de algumas variáveis locais para uma nova chamada da função dentro da mesma sessão, mantendo-as locais, deve-se declará-las como persistentes usando a instrução: persistent var1 var2 var3 Esta função é útil para preservar uma variável que, por exemplo, conte o número de chamadas de uma função. Computação 48
Subfunções É possível guardar mais de que uma função num mesmo ficheiro.m. A primeira função pode ser acedida do exterior e deve dar o nome ao ficheiro. As restantes funções, se existirem, são subfunções, escritas do mesmo modo que as funções, mas que só podem ser chamadas pelas funções do mesmo ficheiro. São úteis para programar algoritmos constituídos por várias funções de que o utilizador, muitas vezes, nem sabe da existência. Com isto evita-se, também, um número muito elevado de ficheiros para guardar um algoritmo. Exercício Escreva um programa para, dada uma lista ordenada por ordem crescente, acrescentar um elemento, mantendo a ordenação. Use esta função para ordenar um vector por ordem crescente. ( Nota: se o vector estiver quase ordenado, este é um bom algoritmo de ordenação) Ficheiro ordemc.m function lista=ordemc(lista) % ordemc ordena um vector por ordem crescente % como o argumento output é igual ao input o % MATLAB cria uma copia do argumento input actual n=length(lista); for i=2:n lista(1:i)=colcres(lista(1:i-1),lista(i)); end function lista_out=colcres(lista_in,novo) % subfuncao % supõe que lista_in já está por ordem crescente e % coloca novo por ordem. li=lista_in < novo; lista_out =[lista_in(li), novo, lista_in(~li)]; Computação 49
Alguns comandos >> help ordemc ordemc ordena um vector por ordem crescente como o argumento output é igual ao input o MATLAB cria uma copia do argumento input actual >> help colcres colcres.m not found. >> x=[1 3 9 5 7 12]; >> xord=ordemc(x) xord = 1 3 5 7 9 12 Funções recursivas finito As funções MATLAB podem chamar-se a elas próprias. Isso permite a resolução de problemas iterativamente. No entanto, ao chamar-se a si própria, vai deixando em suspenso cada uma das chamadas. Isso exige um recurso a muita memória o que faz com que só se utilize esta técnica em situações muito especiais. Além disso, é muito importante incluir, numa função recursiva, uma condição que termine a sequência gerada caso contrário o processo pode nunca mais terminar. n 1 i 1 i1 Exemplo: x x x 1 : n xn 1 function norma1=fnor(x) % calcula a norma 1 recursivamente % tem algumas falhas n=length(x); if n==0 disp(' o vector deve ter componentes') %devia ser error elseif n==1 norma1=abs(x) %devia ter ; else norma1=fnor(x(1:n-1))+abs(x(n)) %devia ter ; end Computação 50
Execução >> nn=fnor([1,2,-3]) norma1 = 1 norma1 = 3 norma1 = 6 nn = 6 >> nn=fnor([]) o vector deve ter componentes Warning: One or more output arguments not assigned during call to 'fnor'. Exercício Escreva um programa que determine o termo de ordem n da sequência de Fibonacci u 1 un un1 n 2, u1 1, u2 1 n. function fn=fib(n) % calcula termos da sequencia de Fibonacci if (length(n)~=1) (fix(n) ~= n) (n < 1) error(['n deve ser um escalar inteiro',... ' e positivo']); end if n==1 fn=1; elseif n==2 fn=1; else fn=fib(n-2)+fib(n-1); end Execução >> fib(0)??? Error using ==> fib n deve ser um escalar inteiro e positivo >> fib(3) ans = 2 >> fib(10) ans = 55 Computação 51
Funções como argumentos de funções Função inline Transforma um string numa função. f= inline ( expressão string) f= inline ( expr_string, string_arg1,...) No primeiro caso os argumentos input da função serão todos os nomes usados na expressão ordenados por ordem ASCII. Se não houver nenhum argumento considera x. O segundo caso deve ser usado quando se pretender outra ordem. Esta função pode ser argumento de uma função, mas também pode ser calculada Exemplos 1. >> f=inline('2*pi') f = Inline function: f(x) = 2*pi >> f(2) ans = 6.2832 2. >> g1=inline('[2:3]''+[x,y]''') g1 = Inline function: g1(x,y) = [2 3]'+[x y]' 3. >> ff=inline('2*x*z*aa+aa*a_') ff = Inline function: ff(aa,a_,aa,x,z) = 2*x*z*aa+aA*a_ 4. >> ff=inline('2*x*z*aa+aa*a_','x','z','aa','a','aa') ff = Inline function: ff(x,z,aa,a_,aa) = 2*x*z*aa+aA*a_ Computação 52
Função handle Se uma função vai ser argumento de uma função, deve usar-se @ para obter a "function handle". Exemplo: >> g=@sin g = @sin >> g(2) ans = 0.9093 Este manípulo da função além de servir para parâmetro de funções serve também para aceder a funções como se delas se tratassem, mas com outro nome, guardando toda a informação necessária para aceder à função pretendida. Isto permite executar uma função que, entretanto, deixou de estar no path percorrido pelo Matlab para busca de funções. Além disso, também permite aceder a subfunções, desde que, a função handle seja definida dentro do ficheiro que a contém e seja transferida a informação por um argumento de output Exemplo Alterar a função definida na pág.49 para definir a função handle fh function [lista,fh]=ordemc(lista) % ordemc ordena um vector por ordem crescente % como o argumento output e igual ao input o % MATLAB cria uma copia do argumento input actual fh=@colcres; n=length(lista); for i=2:n lista(1:i)=colcres(lista(1:i-1),lista(i)); end function lista_out=colcres(lista_in,novo) % subfuncao li=lista_in < novo; lista_out =[lista_in(li), novo, lista_in(~li)]; Computação 53
Execução >> [l,fh]=ordemc([3 2 5]); >> fh([2,3],1) ans = 1 2 3 % a função colcres é executada através da função handle fh >> colcres([2,3],1)??? Undefined command/function 'colcres'. % a função colcres não é reconhecida Nas versões anteriores de MATLAB, os argumentos funções eram introduzidos como "strings" com o nome da função e para a executar usavam a função feval, por exemplo, feval('sin',2). A versão actual também aceita o "string" como argumento, mas aconselha que se use antes a função "handle". Muitas funções aceitam para argumentos funções, além destes dois processos, um "string" com a expressão da função como em inline. Isso acontece porque, esses programas usam a função fcnchk ( help fcnchk ) que ou cria uma função handle ou uma função tipo inline. Função feval ( nome, argumentos ) - calcula uma função definida pelo seu nome, nos argumentos dados. Função eval ( string ) calcula a expressão definida por string Exemplo: >> x=eval('sin(pi/4)') x= 0.7071 Computação 54
Gráficos Como o MATLAB opera com matrizes, um gráfico é uma colecção de pontos que podem estar ou não estar ligados por linhas. No MATLAB usualmente existe apenas uma janela gráfica (figure window). Se existir mais do que uma só uma delas é a janela corrente. Quando se manda traçar um gráfico novo, de um modo geral, este apaga o antigo. Depois de traçar um gráfico é possível introduzir títulos, legendas, etc. Gráficos 2-D (função plot) 1. plot(y) 2. plot(yc) 3. plot(x,y) 4. plot(x,y,linhaesp,'control_linha',valor,...) 5. plot(x1,y1,linhaesp,x2,y2,linhaesp,...,xn,yn,...) onde x e y são matrizes e yc é uma matriz de complexos. No primeiro caso, y só pode ser real, traça os gráficos constituído pelos pontos ( índices de y, colunas de y ) ( se y for vector linha ou coluna os pontos são ( i, y(i) ) ). No segundo caso traça o gráfico dos pontos ( parte real, parte imaginária ). Nos restantes casos traça, na mesma figura, os gráficos definidos pelos pontos ( x(i),parte real y(i,j) ), um gráfico por cada j, de acordo com linhaesp e os controlos de linha. Exemplo: >> x=-4:0.1:4; >> y=sin(x); >> plot(x,y); Figure nº1 Computação 55
Execuções Veja-se o que acontece na figure window quando se faz: 1. >> title(' funçao sin(x)'); %título do gráfico 2. >> xlabel('x'); % nome dos eixos 3. >> ylabel('y'); 4. >> grid on; % traça uma grelha 5. >>text(0,0,'\leftarrowsin(x)') %escreve texto no %ponto (0,0) 6. >>plot(x,x); % traça um novo gráfíco %apagando o antigo Os strings dentro de title, xlabel, ylabel,..., aceitam caracteres tipo Tex. Alguns desses caracteres podem ser vistos na Tabela 1. Se se mandar traçar mais do que um gráfico numa mesma figura é necessário diferenciá-los. Vamos usar o linhaesp indicando como string 'cor_estilo de linha_marca' ( pode ver Tabela 2 ). Exemplo: >> x=-4:0.1:4; >> y=sin(x); >> z=cos(x); >> plot(x,y,'k--',x,z,':r'); >> legend('sin(x)','cos(x)') % coloca legendas %por ordem Figure nº. 2 Computação 56
Outra hipótese >> figure %cria uma janela figure nova >> plot(x,y,'k-'); %traça o primeiro gráfico >> hold on % o gráfico antigo não é apagado >> plot(x,z,':r'); % traça o segundo gráfico >> legend('sin(x)','cos(x)') Notas: hold on não apaga o gráfico da figura corrente até se fazer hold off (pode-se sobrepor gráficos); figure(n) torna activa (criando se não existir) a figure window com o handle n (n inteiro). sintaxe símbolo sintaxe símbolo sintaxe símbolo \alpha \phi \leq \beta \rho \neq \gamma \sigma \propto \Gamma \Sigma \div \delta \tau \circ \Delta \omega \leftrightarrow \epsilon \Omega \leftarrow \eta \int \rightarrow \theta \cong \uparrow \lamda \sim ~ \downarrow \mu \infty \bf{...} bold \nu \pm \it{...} itálico \pi \times _{...} inf.linha \Pi \gep ^{...} super.linha Tabela 1- letras gregas, símbolos matemáticos e estilos de letras ( Tex ) sintaxe cor sintaxe Tipo de marca sintaxe Estilo de linha r red + mais - linha sólida g green circulo -- tracejado b blue * asterisco : ponteado c cyan. ponto -. traço ponto m magenta cruz y yellow s quadrado k black d diamante w white ^ triang. cima v triang. baixo > triang.direita < triang.esquerda p pentágono h hexágono Tabela 2 Tabela de especificadores de estilos de linha Computação 57
Escalas logarítmicas Há possibilidade de efectuar 4 combinações de escalas lineares com logarítmicas: função plot semilogx semilogy loglog descrição eixos dos xx e yy lineares eixo do xx logarítmico e eixo do yy linear eixo do yy logarítmico e eixo do xx linear eixos dos xx e yy logarítmicos Exemplos: >> subplot(2,2,1) plot(x,y); title(' linear') grid on; >> subplot(2,2,3) semilogy(x,y); title('x linear y log') grid on; >> subplot(2,2,2) semilogx(x,y); title('x log y linear') grid on; >> subplot(2,2,4) loglog(x,y); title('x log y log') grid on; subplot (n,m,k)- subdivide a figure em n m partes e torna a parte k activa ( n-vertical m-horizontal e k ordenado por linhas ) Computação 58
Função fplot fplot(funcao,limites,...) desenha a função em funcao, escolhendo os pontos de modo conveniente de modo a garantir uma dada precisão ( por omissão, um erro relativo de 0.2% ), dentro dos limites. Esses limites podem ser do tipo [ xmin xmax ] ou [ xmin xmax ymin ymax ] Exemplo: Dado o ficheiro fgrafico.m: function y=fgrafico(x) y=cos(tan(x))-tan(sin(x)); >> subplot(2,1,1) >> x=1:.01:2; >> y=fgrafico(x); >> plot(x,y); >> subplot(2,1,2) >> fplot(@fgrafico,[1 2]); Também se teria obtido o segundo gráfico se: >> fplot('cos(tan(x))-tan(sin(x))',[1,2]); >> fplot(inline('cos(tan(x))-tan(sin(x))'),[1,2]); >> fplot('fgrafico',[1 2]); Computação 59
Outros gráficos 2-D x=[1 2 3 4 5 6]; y=[2 6 8 7 8 5]; figure; subplot(3,2,1); bar(x,y); title('\bfbar plot') axis([0 7 1 8]); subplot(3,2,2); barh(x,y); title('\bfbarh plot') subplot(3,2,3);compass(x,y); title('\bfcompass plot') subplot(3,2,4);pie(x,y); title('\bfpie plot'); legend('1','2','3','4','5','6'); subplot(3,2,5); stairs(x,y); title('\bfstairs plot'); axis([1 6 1 9]); subplot(3,2,6); stem(x,y); title('\bfstem plot') Computação 60
Histogramas Um histograma mostra a distribuição dos valores de um conjunto. Para criar um histograma, o intervalo de variação dos valores é dividido em intervalos ( 10 por omissão ) e é calculado o número de valores do conjunto que caem em cada intervalo. Sintaxe: hist(y) hist(y,nint) hist(y,x) nint diz o número de intervalos x array com os centros dos intervalos Nota: n=hist (y) cria um vector com o número de elementos em cada classe ( não faz o gráfico do histograma ). Exemplo: >>y=randn(10000,1); % matriz 10000*1 com %valores aleatorios normalmente distribuidos >> subplot(2,1,1) >>hist(y,15); >> x=[-3-2 -1 0 1 2 3 ]; >> subplot(2,1,2) >>hist(y,x); Computação 61
Gráficos 3-D Matlab permite traçar gráficos de dimensão 3 de funções de 2 tipos: duas funções da mesma variável independente, unindo os pontos constituídos pelos valores das funções e o valor da variável independente - gráficos de linhas; uma função de duas variáveis independentes, definida numa malha rectangular do plano associado a essas duas variáveis- gráficos de superfície e de contornos. Gráficos de linha 3-D Podem ser obtidos pela função plot3 plot3 (x,y,z) onde x,y e z são arrays com a mesma dimensão contendo os pontos a traçar no gráfico. Exemplo % grafico plot3 t=0:0.1:10; x=exp(-0.1*t).*cos(2*t); y=exp(-0.1*t).*sin(2*t); plot3(x,y,t); title('grafico de linha \bf{3-d}'); grid on Resultado Computação 62
Gráficos de superfície Para obter gráficos de superfície é necessário criar três arrays com a mesma dimensão que contêm as coordenadas de todos os pontos a traçar. Por exemplo, se quisermos traçar o gráfico definido pelos 4 pontos (0,0,1);(0,1,2);(1,0,3);(1,1,4), teremos que construir os três seguintes arrays: 0 1 0 0 1 3 x y z 0 1 1 1 2 4 E poderíamos, por exemplo, fazer: >> figure >> subplot(1,2,1) >> mesh(x,y,z) >> colorbar >> subplot(1,2,2) >> surf(x,y,z) >> axis square Resultado Função meshgrid Esta função permite criar as matrizes X e Y, idênticas às anteriores, a partir da sequência dos valores a atribuir a x e a y. Essas matrizes vão representar os pontos da malha rectangular onde a função deve ser calculada. [X,Y]=meshgrid(x,y); [X,Y]=meshgrid(x); Computação 63
onde [X,Y]=meshgrid(x) [X,Y]=meshgrid(x,x) Exemplo: >> [xx,yy]=meshgrid(0:1) xx = 0 1 0 1 yy = 0 0 1 1 Função mesh Esta função liga os pontos através de uma rede ( trama ) cujas linhas, por omissão, têm cores dependendo do valor de z ( pode ver shading) mesh(x,y,z) mesh(z) meshc(x,y,z) meshz(x,y,z) Exemplos >> [x,y]=meshgrid(-2:0.1:2); >> z=x.*exp(-((x-y.^2).^2+y.^2)); >> subplot(2,2,1); >> mesh(x,y,z) >> subplot(2,2,2); >> mesh(z) >> subplot(2,2,3); >> meshc(x,y,z) >> subplot(2,2,4); >> meshz(x,y,z) Computação 64
Função surf Coloca cores nas facetas criadas pela rede que une os pontos definidos por (X,Y,Z) surf(z) surf(x,y,z) surfc(...) Exemplos: >>figure; >>subplot(2,1,1); >>surf(x,y,z); >>subplot(2,1,2); >>surfc(x,y,z); Computação 65
Função contour (pcolor,...) A função contour traça as isolinhas ( linhas que unem os pontos com o mesmo valor de Z ) do gráfico definido por ( X,Y,Z ), projectadas no plano X,Y. contour(z) contour(x,y,z) contour(x,y,z,n)... onde n é o números de isolinhas a traçar. Exemplos: figure subplot(3,2,1);contour(x,y,z); subplot(3,2,2);contour(x,y,z,10,'k');axis off; subplot(3,2,3);pcolor(x,y,z); axis off; subplot(3,2,4);pcolor(x,y,z); axis off; shading flat subplot(3,2,5);pcolor(x,y,z); axis off; shading interp subplot(3,2,6);pcolor(x,y,z); axis off; shading interp hold on contour(x,y,z,'k'); %outras experiências hold off [c,h]=contour(x,y,z); clabel(c,h); Computação 66
Anexo 1 - Funções Funções matemáticas elementares Trigonometria: sin cos tan sec csc cot -seno. sind - seno em Graus (desde Matlab 7.0). sinh - seno hiperbólico. asin - inverso do seno (arsen). asind - inverso do seno em Graus (desde Matlab 7.0) asinh - inverso do seno hiperbólico. -coseno. cosd / cosh / acos / acosd/ acosh. -tangente. tand / tanh / atan / atand / atanh. atan2(x,y) - inverso da tangente entre - e (atan entre -/2 e /2). -secante. secd / sech / asec / asecd / asech. -cosecante. cscd / csch / acsc / acscd / acsch. -cotangent. cotd / coth / acot / acotd / acoth. Exponenciação: exp -exponencial (e x ). log -logaritmo natural ou neperiano. log10 -logaritmo na base 10. log2 -logaritmo ns base 2 (e... ver help). pow2-2 x ( e... ver help ). sqrt - x. nextpow2 - (ver help). Complexos: abs - valor absoluto 2 2 a bi a b. angle - semelhante a atan2 (argumento complexo). complex - constrói um complexo dada a parte real e imaginária. conj - conjugado de um complexo. imag - parte imaginária de um complexo. real - parte real de um complexo. isreal - verdadeiro se o array é real. Computação 67
Arredondamentos e restos: fix - arredonda para o inteiro mais próximo de zero. floor - arredonda para o inteiro mais próximo de. ceil - arredonda para o inteiro mais próximo de. round - arredonda para o inteiro mais próximo. mod - resto da divisão (com o sinal do divisor) (ver help). rem - resto da divisão (com o sinal do dividendo) (ver ). sign - sinal. Matrizes elementares zeros - array de zeros. ones - array de uns. eye - matriz identidade. repmat - copia um array. rand - gera números aleatórios uniformemente distribuídos. randn - gera números aleatórios normalmente distribuídos. linspace - gera um vector linearmente espaçado. logspace - gera um vector logaritmicamente espaçado. Informação básica de arrays size length ndims disp error isempty isequal isnumeric islogical logical - dimensão do array. - maior das dimensões do array (length(a) max(size(a))). - número de índices do array. - escreve uma matriz (ou texto). - escreve mensagens de erro parando a execução. - verdadeiro se a matriz é vazia. - verdadeiro se os arrays são idênticos. - verdadeiro se o array é numérico. - verdadeiro se o array é lógico. - converte valores numéricos em lógicos. Computação 68
Manipulação de matrizes find end cat diag flipdim fliplr flipud repmat reshape rot90 tril triu -encontra os índices dos elementos não nulos. -se for índice representa o último índice, caso contrário termina as instruções for, while, switch, try, e if. - concatenação de arrays. - cria matrizes diagonais ou diagonais de uma matriz. - troca a ordem segundo uma dada dimensão. - troca as colunas das matrizes da esquerda para a direita. - troca as linhas das matrizes da cima para a baixo. - forma um array com cópias de outro array. - redimensiona uma matriz com m*n elementos. - roda as matrizes 90 graus. - parte triangular inferior de uma matriz. - parte triangular superior de uma matriz. Análise de dados cumprod - produto acumulado. cumsum - soma acumulada. factor - decompõe em factores primos. max - elementos máximos de um array. mean - média dos valores de um array. median - mediana dos valores de um array. min - elementos mínimos de um array. perms - todas as permutações. polyarea - área de um polígono dado pelos vértices. primes - gera uma lista de números primos. prod - produto de elementos de um array. sort - ordena os elementos por ordem ascendente. std - desvio padrão. sum - soma de elementos de um array. var - variância. Conversão de sistemas de coordenadas cart2pol cart2sph pol2cart sph2cart - transforma coordenadas cartesianas em polares ou cilíndricas. - transforma coordenadas cartesianas em esféricas. - transforma polares ou cilíndricas em coordenadas cartesianas. - transforma coordenadas esféricas em cartesianas. Computação 69
Funções de Vectores cross - produto vectorial de dois vectores de R 3. dot intersect ismember setdiff setxor union unique - produto escalar de dois vectores. - determina a intersecção de dois vectores. - verdadeiro se o(s) elemento(s) pertencerem ao conjunto. - determina os elementos que pertencem a um vector e não a outro. - dertermina os elementos que não pertencem à intersecção. - determina a reunião dos elementos sem repetições. - elimina os elementos repetidos dos arrays. Tempo e Datas calendar - dá o calendário de um dado mês. clock cputime date datenum datestr datevec eomday etime now tic, toc weekday - dá as horas incluindo data. - tempo de CPU (em segundos) desde o início. - um "string" com a data. - dá o número em dias de uma data. - define o formato da data. - cria um vector com a data. - último dia de cada mês (ano). - diferença de tempo. - número com informação da data e tempo. - tic começa a contar o tempo e toc dá o tempo que passou após tic. - dia da semana. Análise matricial cond - número de condição. det - determinante da matriz. norm - norma de vectores e matrizes. null - base ortonormal do núcleo da matriz. orth - base ortonormal do contradomínio da matriz. rank - característica da matriz. rcond - estimativa do recíproco do número de condição. rref, rrefmovie- forma reduzida da matriz (Gauss-Jordan). trace - soma dos elementos da diagonal. Computação 70
Funções Lógicas any all find -é verdadeiro se algum dos elementos for diferente de zero (com matrizes opera por colunas). Exemplo: any([0 1 0])1 -é verdadeiro se todos os elementos forem diferentes de zero (com matrizes opera por colunas). Exemplo: all([1 2-1])1 -fornece um vector com os índices dos elementos diferentes de zero. Exemplo: find([0 3 0;2 0 3])[2 3 6]'; isfinite -dá um array com 1 onde os elementos são finitos e zero nos restantes. Exemplo: isfinite([0 3 inf;2 NaN 3])[1 1 0;1 0 1]; isnan isinf ischar isempty -dá um array com 1 onde os elementos são NaN e zero nos restantes. Exemplo: isnan([0 3 inf;2 NaN 3])[0 0 0;0 1 0]; -dá um array com 1 onde os elementos são inf e zero nos restantes. Exemplo: isinf([0 3 inf;2 NaN 3])[0 0 1;0 0 0]; -dá 1 se o array for de caracteres. Exemplos: ischar([0 3 inf;2 NaN 3])0; ischar(['abc','de']) 1 -dá 1 se o array é vazio. Manipulação de strings findstr int2str lower num2str strcat strcmp strcmpi upper -encontra um string dentro de outro. -converte a parte inteira do número em string. -altera o string para letras minúsculas. -converte o número em string. Exemplos: num2str(a) escreve até 4 casas decimais. num2str(a,n) escreve até n caracteres. -concatenação de strings. -compara strings. -compara strings sendo indiferente o uso de maiúsculas ou minúsculas. -altera o string para letras maiúsculas. Computação 71
Outras funções eval feval -interpreta strings contendo expressões Matlab. -calcula o valor de funções. func2str -constrói um string com o nome da função "handle". str2func -constrói uma função "handle" de um string com o nome da função. fzero nargin nargout poly polyfit -encontra o zero de uma função de uma variável próximo de um ponto dado. Exemplo: Encontrar o zero de sen x próximo de 3 x = fzero(@sin,3) x = 3.1416 -número de argumentos de entrada (input) da função. -número de argumentos de saída (output) da função. -dá os coeficientes de um polinómio dado um vector com as raízes. -dá os coeficientes de um polinómio que aprima uma lista de pontos dados no sentido dos "mínimos quadrados". polyval roots -dá o valor do polinómio de um determinado grau em pontos conhecido o vector dos coeficientes do polinómio. -dá um vector com as raízes do polinómio conhecido o vector dos coeficientes do polinómio. Comandos gerais cd clear -muda a directoria corrente. -retira variáveis do workspace. copyfile -copia ficheiros. delete diary dir doc exist format load lookfor -apaga ficheiros ou objectos gráficos. -guarda a sessão num ficheiro do disco. -lista a directoria. -mostra a documentação do Help em HTML. -verifica se o ficheiro ou variável existe. -controla o formato do output. -inicializa variáveis a partir do disco. -procura por um texto no help (demora muito tempo). Computação 72
mkdir -cria novas directorias. path -controla o caminho de busca de directorias usado pelo Matlab. pwd -mostra o nome da directoria corrente. rmpath -elimina directorias do path. save -guarda variáveis do workspace no disco. type -lista ficheiros. what -lista ficheiros da directoria corrente. who, whos -lista as variáveis do workspace. Funções gráficas bar -gráfico de barras vertical. barh -gráfico de barras horizontal. Compass -gráfico compasso. contour -gráficos de linhas de nível. contourf -gráficos de linhas de nível cheio. figure -cria uma janela gráfica. fplot -gráfico de funções. hist -histogramas. hold -mantém o gráfico corrente. loglog -gráfico com escalas logarítmicas. mesh -gráficos com uma trama (3-D). meshc -gráfico combinado de mesh e countour (3-D). meshgrid -cria as matrizes x e y necessárias para os gráficos 3-D. pie -gráfico redondo. plot -gráfico de vectores e matrizes. plot3 -gráfico de linhas e pontos em 3-D. polar -gráfico de coordenadas polares. print -imprime o gráfico ou guarda-o num ficheiro. saveas -guarda uma figura num ficheiro gráfico. semilogx -gráfico com escala logarítmica em x. semilogy -gráfico com escala logarítmica em y. shading -define o modo de sombrear. stairs -gráfico em escada. Computação 73
stem3 subplot surf surfc -gráfico de dados discretos em 3-D. -cria subdivisões numa figura. -gráfico com as facetas coloridas (3-D). -gráfico combinado de surf e countour (3-D). Anotações gráficas e grelhas axis -coloca eixos no gráfico. clabel -adiciona rótulos aos contornos dos gráficos contour. colorbar -barra com a escala das cores. grid -traça redes nos gráficos. gtext -coloca texto num gráfico usando o rato. legend -coloca legendas. text -cria um texto (strings). texlabel -produz caracteres TeX dum string de caracteres. title -coloca títulos. xlabel -rótulo no eixo dos x. ylabel -rótulo no eixo dos y. zlabel -rótulo no eixo dos z Precedência dos operadores 1. Parêntesis () 2. sinal mais (+), sinal menos (-), negação lógica (~) (operadores unários) 3. Transposta (.'), potência (.^), transposta da conjugada('), potência de matrizes (^) 4. Multiplicação (.*), divisão à direita (./), divisão à esquerda (.\), multiplicação de matrizes (*), divisão à direita de matrizes (/), divisão à esquerda de matrizes (\) 5. Adição (+), subtracção (-) 6. Operator (:) 7. Menor que (<), menor ou igual a (<=), maior que (>), maior ou igual a (>=), igual a (==), diferente de (~=) 8. conjunção lógica (&) 9. Disjunção lógica ( ) 10. Circuito curto (& &) 11. Circuito curto ( ) Computação 74
Anexo 2 Outras estruturas de dados Arrays de células Nas variáveis comuns os elementos têm de ser do mesmo tipo. Nos arrays de células os elementos podem ser de qualquer tipo. Os elementos são arrays de qualquer tipo. São reconhecidos por incluir dentro de chavetas {} os diferentes elementos separados por vírgulas (, ) ou ponto e vírgula ( ; ), do mesmo modo que se faz com o operador de concatenação []. Exemplo: >> A={1,ones(2);'Carlos',zeros(2,1)} A = [ 1] [2x2 double] 'Carlos' [2x1 double] Para definir um elemento ou aceder a um elemento, há dois processos. Para definir, ou se designa o elemento como se fosse um elemento de um array comum, usando índices dentro de parêntesis (), e no segundo membro usam-se chavetas {}, ou se colocam os índices dentro de chavetas {} e no segundo membro apenas o array, sem {}. Para aceder, se colocar os índices dentro de chavetas {} obtêm o array, conteúdo da célula, se colocar os índices dentro de parêntesis () obtêm a célula. A função iscell permite analisar isso. Se quiser aceder a um elemento (m,n) do array na posição (i,j) deve usar a sintaxe var=variável{i,j}(m,n) Se quiser fazer uma pré-alocação (isto é, reservar uma dada dimensão) da variável deve usar a função cell. Exemplos: >> B=cell(3,2) B = [] [] [] [] [] [] Computação 75
>> B(2,1)=5??? Conversion to cell from double is not possible. >> B(2,1)={5} B = [] [] [5] [] [] [] >> B{3,2}=ones(2) B = [] [] [5] [] [] [2x2 double] >> B(1,:)={eye(2),ones(2,1)} B = [2x2 double] [2x1 double] [ 5] [] [] [2x2 double] >> a=b{1,2} a = 1 1 >> b=b(1,2) b = [2x1 double] >> iscell(a) ans = 0 >> iscell(b) ans = 1 >> B(2,1) ans = [5] >> B{2,1} ans = 5 >> B(3,1)=[1 2]??? Conversion to cell from double is not possible. >> B{1,1}(2,1) ans = 0 Estruturas As estruturas permitem agrupar, numa única variável, vários tipos de dados associados a cada elemento. Para os identificar é usado, como extensão ao nome da variável, um identificador de campo. Exemplo: turma.nome='pedro' turma.idade=18 turma.sexo='m' Resultado: turma = nome: 'Pedro' idade: 18 sexo: 'M' Computação 76
No exemplo anterior a variável turma tem um elemento e três campos: nome; idade e sexo. Esta variável tal como os arrays pode ter mais do que um elemento reconhecido pela colocação de índices dentro de parêntesis () separados por vírgulas. Exemplo: >> turma(3).nome='ana' turma = 1x3 struct array with fields: nome idade sexo Quando se define um novo elemento os campos não preenchidos, e necessários para completar a estrutura, são preenchidos com a matriz vazia []. Exemplo: >> turma(2) ans = nome: [] idade: [] sexo: [] >> turma(3) ans = nome: 'Ana' idade: [] sexo: [] >> turma(4)??? Index exceeds matrix dimensions. Podemos, também, iniciar uma estrutura com a função struct com a seguinte sintaxe var=struc('nome_campo_1', valor1, 'nome_campo_2', valor2,...) Exemplo: >> turma(2)=struct('nome','vitor Manuel','idade',19,... 'sexo','m') Computação 77
Resultado: turma = 1x3 struct array with fields: nome idade sexo Exemplo: >> turma(2) ans = nome: 'Vitor Manuel' idade: 19 sexo: 'M' Se usar variável.nome_campo têm-se acesso à lista dos elementos daquele campo. Como instrução vai atribuir a ans sucessivamente os diferentes valores daquele campo. Se se quiser criar uma variável com essa lista, essa variável pode ser um array de células, var={variável.nome_campo}, ou, quando possível uma variável concactenação dos elementos diferentes de vazio daquele campo. Exemplos: >> turma(2).nome=[]; >> varnomes=[turma.nome] varnomes = PedroAna >> nomes={turma.nome} nomes = 'Pedro' [] 'Ana' Se se quiser ter acesso ao elemento (m,n) de um dado campo, nome_campo, do elemento (i,j), da estrutura, variável, deve usar-se a sintaxe: var=variável(i,j).nome_campo(m,n) Exemplos: >> turma(1).nome(3) ans = d >> v=turma(1).nome(1:3) v = Ped Computação 78