Baixe o app para aproveitar ainda mais
Prévia do material em texto
Índice de conteúdos Índice de conteúdos Capítulo 1.Programação em MatLab.........................................................1 1.A linguagem MatLab................................................................................1 2.Estrutura de um programa.......................................................................1 3.Separadores de comandos........................................................................1 4.Comentários.........................................................................................1 5.Tipos de dados básicos............................................................................2 6.Números complexos...............................................................................3 7.Variáveis.............................................................................................3 8.Variáveis predefinidas (constantes)............................................................4 9.Operadores e expressões.........................................................................4 10.Instrução de atribuição..........................................................................6 11.Matrizes.............................................................................................7 12.O operador ":"....................................................................................12 13.Funções matemáticas básicas................................................................13 14.Funções...........................................................................................15 15.Comandos de leitura/entrada e escrita/saída padrão....................................16 16.Estruturas condicionais........................................................................17 17.Estruturas de repetição........................................................................20 18.O comando error................................................................................22 19.Funções para manipular strings..............................................................23 20.Comandos de leitura e escrita de dados formatadas em ficheiros....................27 21.Estruturas.........................................................................................32 22.Funções gráficas.................................................................................43 - i - Programação em MatLab Capítulo 1. Programação em MatLab 1. A linguagem MatLab O nome MatLab deriva de MATrix LABorator. É um sistema interativo, baseado na representação matricial para a resolução de problemas, no âmbito científico e de engenharia, e para a sua visualização gráfica. Possui um conjunto de “Toolboxes” (Sistemas de Controlo, Otimização, Redes Neuronais Artificiais) que permitem resolver classes particulares de problemas. Tem a possibilidade de chamar rotinas desenvolvidas em C ou em Fortran. 2. Estrutura de um programa O MatLab é usado interativamente; isto é, dado um comando, este é interpretado fornecendo os resultados solicitados. Um programa é uma sequência destes comandos, os quais podem ser escritos num ficheiro para uma execução posterior. Um programa, para além de comandos, pode também conter chamadas a funções. O ficheiro que contém o programa tem que ter a extensão ".m" para ser reconhecido pelo MatLab; a este ficheiro que contém a sequência de comandos principais, dá-se o nome de script. Um ficheiro apenas pode conter um programa. Caso este programa faça uma chamada a uma função, esta tem que estar definida num outro ficheiro. Um ficheiro pode ter mais do que uma função, sendo que todas as funções, com exceção da primeira, só podem ser chamadas pelas funções que estejam definidas naquele ficheiro. 3. Separadores de comandos Para separar comandos podem ser utilizados o <enter>, a virgula (,) ou o ponto e virgula (;). O <enter> e a virgula (,) executam o comando e, se tiver um resultado, mostra-o no monitor; o ponto e virgula (;) apenas executa o comando. Podem-se escrever vários comandos na mesma linha, desde que separados por vírgulas e/ou ponto e vírgulas. 4. Comentários Um comentário é um texto inserido em qualquer parte do programa ou função, para aumentar a sua clareza. Um texto precedido pelo caráter "%" é considerado um comentário. - 1 - Tipos de dados básicos 5. Tipos de dados básicos Existem essencialmente dois tipos de dados básicos: texto e numérico. O tipo de dados texto é usado para tratar caracteres (char) e cadeias de caracteres (strings). Uma string é composta por uma cadeia de carateres, delimitada por plicas ('x...x'). Sobre as strings podem ser aplicadas algumas funções predefinidas, tais como: - concatenação de várias strings (strcat); ex: strcat('um', 'dois', 'tres') resulta em 'umdoistres' - determinar o tamanho/comprimento de uma string r (length); ex: lenght('texto') resulta em 5 - determinar o índice do primeiro caráter da string r igual à string s, em que s é uma subcadeia da cadeia r (findstr); ex: findstr('abcd', 'bc') resulta em 2 e findstr('abcd', 'bck') resulta em vazio. O tipo de dados numérico tem vários subtipos (dependendo da versão do MatLab), como sejam os seguintes: single, double → Números reais (por defeito) uint8, uint16, uint32, uint64 → Números inteiros sem sinal int8, int16, int32, int64 → Números inteiros com sinal Os tipos de dados associados aos números inteiros suportam os seguintes conjuntos de valores: intB = {-2B-1, ..., 2B-1-1}, B {8, 16, 32, 64}. Ex: B = 8, int8 = {-27,..., 27-1} = {-128,..., 127}. uintB = {0, ..., 2B-1}, B {8, 16, 32, 64}. Ex: B = 8, uint8 = {0,..., 28-1} = {0, ..., 255}. Um valor numérico é, por defeito, do tipo double (armazenado em 8 Bytes), mas podem ser usados os outros tipos de dados através da transformação de tipo (casting). Exemplo: programa: A = uint8(89); B = int8(89); C = int16(787); D = int32(345); E = uint32(3534); X = 4.5; Y = double(6.7); Z = single(2.4); whos resultado da execução: Name Size Bytes Class A 1x1 1 uint8 array B 1x1 1 int8 array C 1x1 2 int16 array D 1x1 4 int32 array E 1x1 4 uint32 array X 1x1 8 double array Y 1x1 8 double array Z 1x1 4 single array Grand total is 8 elements using 32 bytes 6. Números complexos Um número complexo possui a seguinte forma: a + bi. Como MatLab entende as letras i e j como √(−1), é aconselhado não utilizar tais letras como nomes de variáveis. - 2 - Números complexos Algumas funções predefinidas para manipulação de números complexos são as seguintes: real(C) → Devolve a parte real de um número complexo C imag(C) → Devolve a parte imaginária de um número complexo C conj(C) → Devolve o conjugado de um número complexo C angle(C) → Devolve a fase de um número complexo C abs(C) → Devolve o módulo de um número complexo C Exemplos: >> imag(3+4i) ans = 4 >> real(3+4i) ans = 3 >> conj(3+4i) ans = 3.0000 - 4.0000i >> angle(3+4i) ans = 0.9273 >> abs(3+4i) ans = 5 7. Variáveis As variáveis são representadas por identificadores compostos por cadeias de carateres alfanuméricos e do caráter "_" (por ex: tempo, x, X). Os elementos de vetores e matrizes são referenciados por índices (por ex: V(i), m(i,j)). As variáveis não são declaradas, apenas usadas como parte de expressões. O Matlab é CaseSensitive, ou seja X e x são diferentes. O Matlab trabalha fundamentalmente com um tipo de dados: matrizes de números reais ou complexos. Casos especiais de matrizes são os escalares (matriz 1x1) e os vetores (matriz linha 1xm e matriz coluna nx1). Uma variável pode ser utilizada para armazenar conjuntos de dados do mesmo tipo, nas seguintes formas: - um escalar (dimensão 1 x 1) - umvetor coluna (dimensão n x 1), - um vetor linha (dimensão 1 x m), - uma matriz (dimensão n x m). Escalar Vetor coluna Vetor linha Matriz 5 3 5 8 3 11 9 6 3 1x1 7 1X3 5 7 2 4 4 8 1 3X1 3x3 8. Variáveis predefinidas (constantes) Uma variável predefinida, ou constante, é aquela em que o MatLab lhe atribui um valor inicial e às quais se podem aplicar a generalidade das características das variáveis. Algumas constantes em MatLab são as seguintes: ans → Variável usada para guardar o valor da última operação efetuada eps → Precisão do computador usado (diferença entre 1.0 e o valor real mais próximo) pi → Valor de p = 3.141592654... i e j → representação de número imaginário (0 + 1.0000i = √-1) - 3 - Variáveis predefinidas (constantes) inf → infinito (∞) Nan → Significa que não é um número (not a number); por exemplo, 0/0 clock → Tempo corrente – vetor com ano, mês, dia, hora, minuto e segundo date → Data atual – string no formato DD-MMM-AAAA (ex: 20-Apr-2016) Exemplos: programa: tempo = clock; disp('Tempo atual : '); disp(tempo); Data = int16([tempo(3) tempo(2) tempo(1)]); Hora = int8([tempo(4) tempo(5) tempo(6)]); disp('Data (dia mes ano):'); disp(Data); disp('Hora (hh mm ss):'); disp(Hora); resultado da execução: Tempo atual : 1.0e+003 * 2.0160 0.0040 0.0200 0.0190 0.0400 0.0503 Data (dia mes ano): 20 4 2016 Hora (hh mm ss): 19 40 50 No entanto, qualquer um destes identificadores pode ser redefinido pelo programador como outra entidade (uma variável) e utilizado dessa forma. Exemplo: >> pi ans = 3.1416 >> pi = 23 pi = 23 >> A = 2 * pi A = 46 9. Operadores e expressões O MatLab é uma linguagem que aceite três tipos operadores e de expressões: aritméticos, lógicos e de texto (literais). 9.1. Operadores e expressões aritméticas Os operadores aritméticos são os seguintes: - → Negação (operador unário) + → Adição - → Subtração * → Produto/multiplicação / → Divisão "por" (ex: 10/5 = 2) \ → Divisão "para" (ex: 10\5 = 0.5 = 5/10) rem/mod → Resto da divisão inteira (ex: 13/5 = 2; resto = 3) ^ → Potência (ex: 5^2 = 52 = 25) Uma expressão aritmética pode ser criada utilizando: - valores numéricos e/ou constantes, - variáveis (desde que já criadas e com valores), - funções aritméticas (predefinidas e/ou criadas pelo utilizador), - 4 - Operadores e expressões - operadores, - parêntesis, - operador Ellipsis (...), que serve para continuar uma expressão noutra linha do texto. Exemplo: programa: a = 10; resultado = (pi + 5) * a + floor(23.87) ... / 12 resultado da execução: resultado = 83.3326 Regras de precedência dos operadores nas expressões: 1. () parêntesis 2. ^ potenciação 3. - sinal de negação (operador unário) 4. *, /, \ produto e divisões 5. +, - adição e subtração Exemplos: >> - (3 + 5) * 2 ans = -16 >> - 3 + 5 * 2 ans = 7 9.2. Expressões lógicas Uma expressão lógica é aquela em que os operadores são lógicos e operandos são relações e/ou variáveis do tipo lógico. O resultado de uma relação ou de uma expressão lógica é verdadeiro ou falso; contudo, no MatLab o resultado é numérico: 1 significa verdadeiro e 0 falso. Os operadores relacionais permitem relacionar entidades do mesmo tipo devolvendo 1 (true) ou 0 (false) e são os seguintes: > → Maior que >= → Maior ou igual que < → Menor que <= → Menor ou igual que == → Igual ~= → Diferente Os operadores lógicos permitem a combinação ou negação das relações lógicas e são os seguintes: & → Conjunção (AND) | → Disjunção (OR) ~ → Negação (NOT) XOR → Disjunção binária exclusiva (XOR) - 5 - Operadores e expressões Os operadores lógicos operam segundo a tabela seguinte: A B AND OR XOR NOT (B) 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 10. Instrução de atribuição Para atribuir um valor a uma variável, basta digitar o nome da variável, seguida pelo sinal de atribuição (=), seguido pelo valor. Ou seja, a instrução de atribuição tem o seguinte formato: <variável> = <expressão> em que <variável> e <expressão> são do mesmo tipo (aritmética, lógica ou literal). Exemplos: X = 10, x = 2.3 + X; angulo = cos(2 + x), a = 10; t = 1 (t verdadeiro); w = (a == 5) & t (w = 0, pois (a == 5) é falso e, falso & falso = falso, ou seja, 0) nome = ‘teste’, mensagem = 'matriz singular' Uma variável, depois de usada, pode ser libertada (tornada não definida). Para tal, usa-se a função clear, a qual tem a seguinte sintaxe: clear ('<variável>') Exemplo: >> A = 25; >> A A = 25 >> clear('A'); >> A ??? Undefined function or variable 'A'. 11. Matrizes 11.1. Definir uma Matriz Os elementos de cada linha são separados por espaços ou vírgulas. O final de cada linha é indicado por um ponto-e-vírgula. A lista de elementos é delimitada por parêntesis retos [ ]. - 6 - Matrizes Exemplos: % Matriz Bidimensional >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1 >> B = [16 3 2 13] % Vetor (Matriz Linha) B = 16 3 2 13 >> C = [16; 5; 9] % Vetor (Matriz Coluna) C = 16 5 9 11.2. Aceder aos elementos de uma Matriz Numa matriz bidimensional, A(i,j) é o elemento da i-ésima linha e j-ésima coluna. Num vetor, B(k) é o k-ésimo elemento. O índice inicial da linha e da coluna de uma matriz, e de um vetor é 1. Exemplos: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> A(2,3) ans = 11 >> B = [16 3 2 13]; >> B(2) ans = 3 11.3. Funções para criar uma Matriz O Matlab possui funções que permitem a criação e manipulação de matrizes, como as seguintes: zeros(m, n) → matriz de zeros de dimensão m x n (m linhas e n colunas) ones(m, n) → matriz de uns de dimensão m x n rand(m, n) → matriz (m x n) de números aleatórios com distribuição uniforme em ]0, 1[ randn(m, n) → matriz (m x n) de números aleatórios com distribuição normal (Gaussiana) de média = 0, variância d2 = 1 e desvio padrão d = 1 eye(m) → matriz identidade (matriz quadrada de ordem m) Exemplos: >> Z = zeros(2, 5) Z = 0 0 0 0 0 0 0 0 0 0 >> Q = ones(3, 5) Q = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 % matriz de dimensão 2 x 4 >> X = rand(2, 4) X = 0.8214 0.6154 0.9218 0.1763 0.4447 0.7919 0.7382 0.4057 % matriz quadrada de ordem 2 >> X = rand(2) X = 0.8913 0.4565 0.7621 0.0185 >> X = randn(2, 3) X = -0.4326 0.1253 -1.1465 -1.6656 0.2877 1.1909 >> A = eye(3) A = 1 0 0 0 1 0 0 0 1 - 7 - Matrizes 11.4. Concatenação de Matrizes A concatenação de matrizes é feita da mesma maneira como é feita a definição de uma matriz. Por exemplo, A = [B C; D E]; as matrizes B e C serão organizadas numa linha, enquanto que as matrizes D e E serão organizadas noutra; o total de linhas de A será a soma do número de linhas de B e D; o total de colunas de A será a soma do número de colunas de B e C. Exemplo: >> B = [1 30 7 ; 5 1 18; 1 4 10]; >> C = [16 2 13; 5 10 8; 9 6 7 ]; >> D = [16 3 13; 6 7 12; 4 14 1]; >> E = [5 11 8; 6 7 12; 4 15 1]; >> A = [B C; D E] A = 1 30 7 16 2 13 5 1 18 5 10 8 1 4 10 9 6 7 16 3 13 5 11 8 6 7 12 6 7 12 4 14 1 4 15 1 11.5. Operadores aritméticos sobre matrizes Os operadores aritméticosque se podem aplicar sobre uma matriz são os seguintes; + → soma termo a termo da matriz. - → diferença termo a termo da matriz. / → produto da primeira matriz pela inversa da segunda; ou seja, as duas expressões seguintes são equivalentes: C = A / B e C = A * inv(B); ./ → divisão termo a termo da matriz; para tal, as matrizes devem ter o mesmo tamanho. * → produto matricial. .* → multiplicação termo a termo das matrizes (devem ter o mesmo tamanho). ^ → produto matricial n vezes (ou seja, X^n = X * ... * X). .^ → operação de potenciação termo a termo da matriz. Exemplo (+): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A + A B = 32 6 4 26 10 20 22 16 18 12 14 24 8 30 28 2 Exemplo (-): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A - A' B = 0 -2 -7 9 2 0 5 -7 7 -5 0 -2 -9 7 2 0 - 8 - Matrizes Exemplo (/): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A / inv(A) B = 378.88 451.77 461.77 408.88 282.88 483.77 525.77 408.88 302.44 474.88 500.88 380.44 320.22 478.44 536.44 494.22 Exemplo (./): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A ./ A B = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Exemplo (*): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A * A B = 341 285 261 269 261 301 309 285 285 309 301 261 269 261 285 341 Exemplo (.*): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A .* A B = 256 9 4 169 25 100 121 64 81 36 49 144 16 225 196 1 Exemplo (^): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A ^ 2 B = 341 285 261 269 261 301 309 285 285 309 301 261 269 261 285 341 Exemplo (.^): >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> B = A .^ 2 B = 256 9 4 169 25 100 121 64 81 36 49 144 16 225 196 1 11.6. Operações com Matrizes Algumas das operações que se podem realizar sobre uma matriz são as seguintes: sum(M) → soma dos elementos de cada coluna da matriz M ’M → matriz transposta da matriz M diag(M) → elementos da diagonal principal da matriz M inv(M) → inversa da matriz M - 9 - Matrizes size(M) → dimensão da matriz M dot(M1, M2) → produto escalar da matriz M1 pela matriz M2 cross(M1, M2) → produto vetorial da matriz M1 pela matriz M2 trace(M) → traço da matriz M (soma dos elementos na diagonal principal) det(M) → determinante da matriz M. [A B] = eig(M) → A = vetores próprios da matriz M; B = valores próprios da matriz M find(condição) → índices de uma matriz que satisfazem uma determinada condição; função muito útil para selecionar elementos de uma matriz; para determinar os resultados, a matriz é percorrida por colunas. Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> sum(A) ans = 34 34 34 34 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> A' ans = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> diag(A) ans = 16 10 7 1 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> inv(A) ans = 1.0e+015 * 0.1251 0.3753 -0.3753 -0.1251 -0.3753 -1.1259 1.1259 0.3753 0.3753 1.1259 -1.1259 -0.3753 -0.1251 -0.3753 0.3753 0.1251 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> size(A) ans = 4 4 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> dot(A, A) ans = 378 370 370 378 - 10 - Matrizes Exemplo: >> B = [1 2 3; 4 5 6;7 8 9]; >> cross(B, B) ans = 0 0 0 0 0 0 0 0 0 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> trace(A) ans = 34 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> det(A) ans = 0 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> [a b] = eig(A) a = -0.5000 -0.8165 0.2236 -0.4082 -0.5000 0.4082 -0.6708 -0.0000 -0.5000 0.0000 0.6708 -0.4082 -0.5000 0.4082 -0.2236 0.8165 b = 34.0000 0 0 0 0 8.0000 0 0 0 0 0.0000 0 0 0 0 -8.0000 Exemplo: >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> [a b] = find(A >= 5 & A < 10) a = 2 3 3 3 2 b = 1 1 2 3 4 Ou seja, são os seguintes elementos da matriz: A(2,1) = 5; A(3,1) = 9; A(3,2) = 7; A(3,3) = 7; A(2,4) = 8. Exemplo: >> B = [16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1]; >> a = find(B < 5 | B >= 15) a = 1 2 3 13 14 16 - 11 - O operador ":" 12. O operador ":" 12.1. O operador ":" sobre Valores Numéricos Trata-se de um poderoso operador do MatLab. Através dele é possível fazer a enumeração intervalada de dados. Este operador permite selecionar um intervalo de valores com um determinado espaçamento, podendo ser utilizado de 2 formas: i : k : j Lista os elementos de i a j, espaçados de k. Se k > 0, j > i; se k < 0, j < i. i : j Lista os elementos de i a j, espaçados de 1, onde j > i. Exemplos: >> 1:10 ans = 1 2 3 4 5 6 7 8 9 10 >> 1:3:27 ans = 1 4 7 10 13 16 19 22 25 >> 60:-7:0 ans = 60 53 46 39 32 25 18 11 4 >> 0:pi/4:pi ans = 0 0.7854 1.5708 2.3562 3.1416 12.2. O operador ":" sobre Matrizes O operador ":" é muito útil quando se deseja usar apenas uma parte da matriz. Por exemplo, A(1:m, n) corresponde aos primeiros m elementos da n-ésima coluna A(2:5, n) corresponde do 2º ao 5º elementos da n-ésima coluna A(:, n) corresponde a todos os elementos da n-ésima coluna A(:, end) corresponde a todos os elementos da última coluna A(m, 1:n) corresponde os primeiros n elementos da m-ésima linha A(m, :) corresponde a todos os elementos da m-ésima linha A(end, :) corresponde a todos os elementos da última linha A(:, [1 2 4]) corresponde às colunas 1, 2 e 4 12.3. O operador ":" para exclusão de Linhas ou Colunas A exclusão de linhas e de colunas é feita definindo a linha ou a coluna a ser excluída como vazia. Exemplo: >> X = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]; >> X(:,2) = [ ] X = 16 2 13 5 11 8 9 7 12 4 14 1 - 12 - Funções matemáticas básicas 13. Funções matemáticas básicas O MatLab disponibiliza várias funções matemáticas básicas, as quais se podem dividir em 4 classes: trigonométricas, exponenciais, numéricas e estatísticas. 13.1. Trigonométricas As funções trigonométricas são as seguintes: sin(x) → seno de x radianos asin(x) → arco cujo seno é x (x real) cos(x) → co-seno de x radianos acos(x) → arco cujo cosseno é x (x real) tan(x) → tangente de x radianos atan(x) → arco cuja tangente é x (x real) sec(x) → secante de x radianos asec(x) → arco cuja secante é x (x real) csc(x) → co-secante de x radianos acsc(x) → arco cuja co-secante é x (x real) cot(x) → co-tangente de x radianos acot(x) → arco cuja co-tangente é x (x real) 13.2. Exponenciais As funções exponenciais são as seguintes: log(x) → logaritmo natural de x (base e), ln(x) log10(x) →logaritmo de x na base 10, log10(x) log2(x) → logaritmo de x na base 2, log2(x) exp(x) → exponencial de x, ex sqrt(x) → raiz quadrada de x pow2(x) → 2 elevado à potência x, 2x 13.3. Numéricas Algumas funções numéricas são as seguintes: abs(x) → valor absoluto de x ceil(x) → arredonda x na direção +∞ round(x) → arredonda x para inteiro mais próximo floor(x) → arredonda x na direção -∞ fix(x) → arredonda x na direção de 0 lcm(x,y) → mínimo múltiplo comum entre x e y - 13 - Funções matemáticas básicas gcd(x,y) → máximo divisor comum entre x e y sign(x) → sinal de x (-1, se x < 0; 1, se x > 0; 0, se x = 0) 13.4. Estatísticas Algumas funções estatísticas são as seguintes: norm(X) → norma de X fft(X) → transformada rápida de Fourier de um vetor X ifft(X) → inversa da transformada rápida de Fourier de um vetor X min(X) → menor elemento da matriz X max(X) → maior elemento da matriz X sort(X) → ordena os elementos da matriz X por ordem crescente mean(X) → média de um vetor X std(X) → desvio padrão de um vetor X 14. Funções Deve-se tomar um certo cuidado com as funções do MatLab, pois esta linguagem possui funções que podem retornar mais de um valor com uma única chamada (ao contrário das funções existentes noutras linguagens que devolvem apenas um resultado). 14.1. Definição de uma função De um modo geral, as funções no MatLab são definidas com a seguinte sintaxe: function [<parâmetros_saída>] = <nome_função> (<parâmetros_entrada>); <comandos> em que function é uma palavra-chave que determina o início físico da função, <nome_função> é o identificador, <parâmetros_entrada> é uma lista de parâmetros de entrada (separados por vírgulas) necessários para o desenvolvimento do algoritmo afeto à função, <parâmetros_saída> especifica as variáveis (separadas por vírgulas) que retornam os resultados da função (os parêntesis retos podem ser omitidos se a existir apenas um parâmetro de saída), e <comandos> são as estruturas que implementam os algoritmos. Exemplo: function [soma, produto] = soma_ produto (a, b); soma = a + b; produto = a * b; É desejável que o nome da função seja igual ao nome do ficheiro onde está definida, mas sem extensão. Para este exemplo, a função soma_ produto deve estar definida dentro do ficheiro “soma_produto.m”. Se o ficheiro e a função tiverem nomes diferentes, então a chamada daquela função é feita pelo nome do ficheiro (sem extensão) e não pelo nome da função. - 14 - Funções Num ficheiro podem ser definidas mais do que uma função, mas a primeira delas deve ter o mesmo nome do ficheiro. As restantes funções só podem ser chamadas pelas funções definidas naquele ficheiro, não podendo ser chamadas por funções definidas noutros ficheiros. As variáveis do programa são criadas no espaço de trabalho (globais). Nas funções as variáveis são locais (não tendo acesso a variáveis globais e nem as podendo criar). Por sua vez, os parâmetros de saída são variáveis globais. 14.2. Chamada de uma função Uma função pode ser chamada incluída numa expressão (se devolve apenas um valor) ou usando uma instrução de atribuição. Neste último caso, a sintaxe da chamada de uma função é a seguinte: [<variáveis>] = <nome_função> (<parâmetros_entrada>) em que <variáveis> é uma lista de variáveis (separadas por vírgulas ou espaços em branco) que recebem os valores devolvidos pela função. Exemplo: >> [s p] = soma_produto(20, 10) s = 30 p = 200 Quando se chama uma função que devolve mais do que um resultado, sem especificar as variáveis que recebem os valores devolvidos pela função, apenas o primeiro resultado é conhecido. Exemplos: >> soma_produto(50, 20) ans = 70 >> a = 100 + soma_produto(30, 20) a = 150 15. Comandos de leitura/entrada e escrita/saída padrão 15.1. Comando de leitura A leitura de dados pelo teclado pode ser feita com a função predefina input, a qual tem as seguintes sintaxes: [<variável>] = input ('mensagem') % para ler valores numéricos ou de texto [<variável>] = input ('mensagem', 's') % para ler apenas valores de texto em que mensagem é o texto a ser exibido ao utilizador (prompt), s para especificar que a entrada do utilizador deve ser texto e <variável> para receber o valor numérico ou de texto inserido pelo utilizador a partir do teclado (valor devolvido pela função input). - 15 - Comandos de leitura/entrada e escrita/saída padrão Exemplos: >> x = input('Insira o seu nome: ') Insira um texto: 'Carlos' x = Carlos >> input('Insira um valor inteiro: ') Insira um valor inteiro: 34 ans = 34 >> st = input('Insira o seu nome: ', 's') Insira o seu nome: Carlos st = Carlos >> st = input('Insira o seu nome: ', 's') Insira o seu nome: 'Carlos' st = 'Carlos' 15.2. Comando de escrita Para se mostrar/escrever os valores das variáveis dentro do programa, pode-se usar o comando disp. Este comando tem a seguinte sintaxe: disp ([var1, ..., varN]) em que var1, ..., varN devem ser do mesmo tipo (ou todos valores numéricos ou todos texto). As vígulas podem ser substituídas por espaços em branco e os parentesis retos podem ser omitidos se se pretende escrever apenas o valor de uma variável. Exemplos: >> m = 25; >> n = 45; >> disp([m, n]) 25 45 >> disp([m n]) 25 45 >> disp(m) 25 >> disp([4, ' < ', 6]) #<# >> disp(['4', ' < ', '6']) 4 < 6 16. Estruturas condicionais São comandos que controlam o fluxo e especificam a ordem em que a computação é feita. No MatLab estes comandos são semelhantes aos usados na linguagem C, mas com uma estrutura diferente. Também aqui existem dois tipos de estruturas condicionais: simples e composta. 16.1. Estrutura condicional simples A estrutura simples é implementada com a estrutura "if-end" e tem a seguinte sintaxe: if <condição> <comandos> end em que if e end são palavras-chave; <condição> é uma expressão lógica; e <comandos> é uma lista de comandos. Se <condição> for verdadeira, então a lista <comandos> é executada; caso contrário, nenhum comando é executado. - 16 - Estruturas condicionais Exemplo: programa: x = input('Insira um numero: '); if x > 0 disp(x); end; resultado da execução 1: Insira um numero: 20 20 resultado da execução 2: Insira um numero: -10 >> 16.2. Estrutura condicional composta A estrutura composta é implementada pela estrutura "if-else-end" e tem a seguinte sintaxe: if <condição> <comandos1> else <comandos2> end em que if, else e end são palavras-chave; <condição> é uma expressão lógica; e <comandos1> e <comandos1> são listas de comandos em que apenas uma delas é executada. Se <condição1> for verdadeira, então a lista <comandos1> é executada; senão é executada a lista <comandos2>. Exemplo: programa: x = input('Insira um numero: '); y = input('Insira outro numero: '); if x < y disp(x); else disp(y); end; resultado da execução 1: Insira um numero: 20 Insira outro numero: 50 20 resultado da execução 2: Insira um numero: 60 Insira outro numero: 30 30 16.3. Estrutura condicional composta com elseif Quando é necessário implementar vários níveis de estruturas if-else, é preferível utilizar a estrutura elseif. Esta estrutura tem a seguinte sintaxe: if <condição1> <comandos1> elseif <condição2> <comandos2> - 17 - Estruturas condicionais else <comandos3> end em que if, else, elseif e end são palavras-chave, <condição1> e <condição2> são expressões lógicas, e <comandos1>, <comandos2> e <comandos3> são listas de comandos em que apenas uma delas é executada. A lista <comandos1> é executadase <condição1> for verdadeira; a lista <comandos2> é executada se <condição1> for falsa e <condição2> verdadeira; e a lista <comandos3> é executada se <condição1> e <condição2> form ambas falsas. Exemplo: programa: x = input('Insira um numero: '); if x > y disp('Numero positivo!'); elseif x == y disp('Numero nulo!'); else disp('Numero negativo!'); end; resultado da execução 1: Insira um numero: 20 Numero positivo! resultado da execução 2: Insira um numero: -30 Numero negativo! 16.4. Estrutura condicional alternativa Esta estrutura, que é parecida com as anteriores, permite que se escolha uma opção entre várias dependendo do resultado de uma variável ou expressão. A sua sintaxe é a seguinte: switch <expressão> case <opção1> <comandos1> . . . case <opçãoN> <comandosN> otherwise <comandos> end em que switch, case, otherwise e end são palavras-chave; <expressão> é uma expressão numérica ou de texto; e <comandos1>, ..., <comandosN> e <comandos> são listas de comandos em que apenas uma delas é executada. Se o valor de <expressão> for igual ao valor de <opção1> então é executada a lista <comandos1>; se não for, mas se o valor desta expressão for igual a <opção2> então é executada a lista <comandos2>; e assim sucessivamente, até se verificar se o valor daquela expressão é igual a - 18 - Estruturas condicionais <opçãoN> que, caso seja, executa a lista <comandosN>; se o valor da <expressão> não for igual a nenhuma das opções, é executada a lista <comandos>. De referir que: i, j, <opçãoi> ≠ <opçãoj>. Exemplo 1: programa: x = input('Insira um numero: '); switch x case 1 y = 10; case 2 y = 30; case 3 y = 50; otherwise y = 100; end; disp([x, y]); resultado da execução 1: Insira um numero: 2 2 30 resultado da execução 2: Insira um numero: 6 6 100 Exemplo 2: programa: x = input('Insira um texto: ', 's'); switch x case '100' disp('CEM'); case '200' disp('DUZENTOS'); case '300' disp('TREZENTOS'); otherwise disp('OUTRO'); end; resultado da execução 1: Insira um numero: 200 DUZENTOS resultado da execução 2: Insira um numero: 20 OUTRO resultado da execução 3: Insira um numero: 100 CEM 17. Estruturas de repetição São estruturas que permitem que uma lista de ações seja executada várias vezes, isto é, repetida. No MatLab estes comandos são semelhantes aos usados na linguagem C, mas com uma estrutura diferente. - 19 - Estruturas de repetição 17.1. Estrutura "while" A estrutura "while" testa uma condição lógica e executa uma lista de comandos enquanto a condição for verdadeira. A sua sintaxe é a seguinte: while <condição> <comandos> end em que while e end são palavras-chave; e <comandos> é a lista de comandos que é executada enquanto a <condição> for verdadeira. Exemplo: programa: a = 1 b = 4 while a < b a = a + 1 b = b - 1 end; resultado da execução: a = 1 b = 4 a = 2 b = 3 a = 3 b = 2 17.2. Estrutura "for" A estrutura "for" é o controlador de fluxo usado quando o número de repetições está definido. A sua sintaxe é a seguinte: for <variável_controlo> = <valor_inicial> : <passo> : <valor_final> <comandos> end em que for e end são palavras-chave e a variável <variável_controlo> assume todos os valores desde <valor_inicial> até <valor_final> com intervalo de variação igual ao valor <passo>. Se o valor <passo> não foi definido, ele assume o valor de 1. Exemplo 1: programa: for i = 1:5 X(i)=i^2; end; disp('X'); disp(X); resultado da execução: X 1 4 9 16 25 - 20 - Estruturas de repetição Exemplo 2: programa: disp('k'); for k = 0:5:15 disp(k); end; resultado da execução: k = 0 5 10 15 17.3. Os comandos continue e break Os comandos continue e break servem para quebrar a continuidade de estruturas de repetição, como o for e o while. No entanto, existe uma grande diferença entre esses dois comandos. O comando continue interrompe a execução da estrutura de repetição e faz com que ela avance para a sua próxima iteração, saltando a que estava a executar. O comando break interrompe a execução da estrutura de repetição e termina-o, saltando para a primeira instrução fora daquela estrutura. Exemplo: programa: k = 0; while k < 5 x = input('Insira um inteiro: '); if x > 0 k = k + 1; V(k) = x; elseif x < 0 continue else break end end k, V resultado da execução: Insira um inteiro: 10 Insira um inteiro: 20 Insira um inteiro: -10 Insira um inteiro: -20 Insira um inteiro: 30 Insira um inteiro: 0 k = 3 V = 10 20 30 >> 18. O comando error O comando error permite terminar a execução do algoritmo (programa ou função). Este comando pode ser usado quando se verifica uma inconsistência, por exemplo, nos parâmetros de entrada ou de uma operação que causaria uma operação inválida. A sua sintaxe é a seguinte: error (mensagem) em que error é uma palavra-chave e mensagem é o texto a apresentar no monitor antes de abandonar o programa ou função. - 21 - Funções para manipular strings 19. Funções para manipular strings Para o MatLab, uma string é com um vetor linha de caracteres. A maioria dos comandos vistos até agora, como acesso a um elemento e seleção de elementos de uma matriz/vetor, são aplicáveis no caso das strings. Exemplo: >> texto = 'Programando em MatLab.'; >> texto(16) ans = M Pode-se também selecionar uma substring de uma string >> texto(16:21) ans = MatLab Apesar do MatLab ser um software voltado para cálculos matemáticos, possui diversas funções para manipulação de strings. A seguir listam-se algumas destas funções. findstrt A sintaxe desta função é a seguinte: <var_retorno> = findstr (<str1>, <str2>) em que dadas duas strings, <str1> e <str2>, esta função verifica se a string de menor tamanho faz parte da string de maior tamanho, devolvendo a posição do caráter inicial da string de menor tamanho na string de maior tamanho. O identificador <var_retorno> é um argumento de saída opcional que recebe o valor inteiro devolvido pela função. Esta função é Case-Sensitive. Exemplo: >> str1 = 'Programando em MatLab.' ; >> str2 = 'MatLab'; >> x = findstr(str2, str1) x = 16 >> x = findstr(str1, str2) x = 16 strcmp A função strcmp compara duas strings e a sua sintaxe é a seguinte: <var_retorno> = strcmp (<str1>, <str2>) em que <str1> e <str2> são as duas strings a comparar, devolvendo 1 (se iguais) e 0 (se diferentes). O identificador <var_retorno> é um argumento de saída opcional que recebe o valor inteiro devolvido pela função. Esta função é Case-Sensitive. Exemplo: >> str1 = 'MATLAB'; >> str2 = 'matlab'; >> x = strcmp(str1, str2) x = 0 - 22 - Funções para manipular strings strcmpi Função para comparar duas strings, mas não é Case-Sensitive. A sua sintaxe é a seguinte: <var_retorno> = strcmpi (<str1>, <str2>) em que <str1> e <str2> são as duas strings a comparar, devolvendo 1 (se iguais) e 0 (se diferentes). O identificador <var_retorno> é um argumento de saída opcional que recebe o valor inteiro devolvido pela função. Exemplo: >> str1 = 'MATLAB'; >> str2 = 'matlab'; >> x = strcmpi(str1, str2) x = 1 strtok Esta função separa uma string em duas substrings e tem a seguinte sintaxe: [<str1>, <str2>] = strtok (<str>, <separador>) em que <str> é a string a ser separada, usando como separadoro carater <separador>. Os identificadores <str1> e <str2> são argumentos de saída que recebem as substrings determinadas. Exemplo: >> [str1, str2] = strtok('MatLab', 'L') str1 = Mat str2 = Lab strcat Esta função determina a concatenação de N strings e a sua sintaxe é a seguinte: <str> = strcat (<str1>, ..., <strN>) em que <str> é a string resultante (e devolvida) com a concatenação de N strings. Na concatenação de strings, os espaços em branco no fim das strings envolvidas são desprezados. O identificador <str> é um argumento de saída opcional. Esta função é Case-Sensitive. Exemplo: >> st = strcat('Programar ', ' em ', ' MatLab. ') st = Programar em MatLab. deblank Esta função determina uma string resultante da remoção dos espaços em branco do final de uma outra string, cuja sintaxe é a seguinte: <strf> = deblank (<str>) em que <strf> é a string definida à custa da remoção dos espaços em branco do final de uma string fornecida como argumento, <str>. O identificador <strf> é um argumento de saída opcional que recebe a string devolvida pela função. - 23 - Funções para manipular strings sprintf A sintaxe desta função é a seguinte: [<str>, <error>] = sprintf (<formato>, <valor>) em que a string <str> é determinada a partir dos elementos de <valor> com um dado <formato>, fornecidos como argumentos; <error> é um argumento de saída opcional que devolve uma mensagem de erro, se ocorrer algum erro, ou uma matrz vazia, se não ocorrer qualquer erro. A função sprintf é semelhante a fprintf, com a diferença que sprintf coloca os dados formatados numa string e não num ficheiro (como fprintf faz). Exemplo: >> str = sprintf('%0d', 12) str = 12 >> str = strcat('MatLab', '_', str) str = MatLab_12 sscanf A sintaxe desta função é a seguinte: [<A>, <contador>, <error>, <seguinte>] = sscanf (<str>, <formato>, <tamanho>) em que a função lê elementos da string <str>, converte-os de acordo com o <formato> especificado e devolve o resultado numa matriz <A>. Os identificadores <contador>, <error> e <seguinte> são argumentos de saída opcionais, em que <contador> devolve o número de elementos lidos com sucesso, <error> devolve uma mensagem de erro (se ocorrer erro) ou uma matriz vazia (se não ocorrer ero) e <seguinte> devolve um valor igual ao número de carateres lidos em <str> mais uma unidade. O argumento de entrada <tamanho> é opcional e especifica o número máximo de elementos que devem ser lidos da string <str> (se não for especificado qualquer valor, serão lidos todos os elementos da string); os valores possíveis são: N (ler no máximo N elementos para um vetor coluna), inf (ler pelo menos até ao fim da string), [m, n] (ler no máximo m x n elementos preenchendo pelo menos uma matriz m x n por colunas). A função sscanf é semelhante a fscanf, com a diferença que sscanf lê os dados formatados de uma string e não de um ficheiro (como fscanf faz). Exemplo: >> [A, contador, error, seguinte] = sscanf('1 2 3 4 5 6 7 8 9', '%d', 5) A = 1 2 3 4 5 - 24 - Funções para manipular strings contador = 5 error = '' seguinte = 10 As funções sprintf e sscanf precisam de um parâmetro formato para especificar a forma como os dados devem ser transformados durante a leitura ou a escrita. Entre os possíveis formatos estão: %s : texto (string) %d : decimal %e : exponencial %f : ponto fixo (quando usado com sprintf, pode-se definir número de casas; ex: %12.5f) int2str Esta função tem a seguinte sintaxe: <str> = int2str (<numero_inteiro>) Converte um número inteiro <numero_inteiro> numa string <str> (argumento de saída opcional). num2str Esta função tem a seguinte sintaxe: <str> = num2str (<numero>) Converte um número qualquer, <numero>, numa string <str> (argumento de saída opcional). str2num A sintaxe desta função é a seguinte: <var_retorno> = str2num (<str>) Converte uma string, <str>, num número de qualquer tipo; <var_retorno> é um argumento de saída opcional que recebe o número devolvido pela função. strtoint A sintaxe desta função é a seguinte: <var_retorno> = strtoint (<str>) Converte uma string, <str>, num número inteiro; <var_retorno> é um argumento de saída opcional que recebe o valor inteiro devolvido pela função. str2double A sintaxe desta função é a seguinte: <var_retorno> = str2double (<str>) Converte uma string <str> num valor de dupla precisão; <var_retorno> é um argumento de saída opcional que recebe o valor de dupla precisão devolvido pela função. - 25 - Comandos de leitura e escrita de dados formatadas em ficheiros 20. Comandos de leitura e escrita de dados formatadas em ficheiros O MatLab possui diversas funções para leitura e escrita em ficheiros de texto e em ficheiros binários. A seguir serão expostas as mais relevantes funções de leitura e de escrita, de modo a abranger os dois tipos de ficheiros. 20.1. Abertura de um ficheiro A função fopen abre um ficheiro com um determinado tipo de permissão e retorna um valor de identificação do ficheiro para posterior manipulação. A sua sintaxe é a seguinte: [<fid>, <mensagem>] = fopen (<nome_ficheiro>, <permissão>) em que <fid> é variável que fica associada ao nome externo do ficheiro <nome_ficheiro> e que será utilizada nos comandos de leitura e escrita no modo especificado pela <permissão>. Os valores (opções) possíveis para <permissão> são os seguintes: 'r' : abre o ficheiro para leitura; 'w' : abre o ficheiro para escrita, criando o ficheiro, se não existe, ou removendo o seu conteúdo, se já existe; 'r+' : abre o ficheiro para leitura e escrita, mas não cria o o ficheiro; 'w+' : abre o ficheiro para leitura e escrita, criando o ficheiro, se não existe, ou removendo o seu conteúdo, se já existe; 'a' : cria e abre um ficheiro novo ou abre um ficheiro já existente para escrita, acrescentado no fim do ficheiro; 'a+' : cria e abre um ficheiro novo ou abre um ficheiro já existente para leitura e escrita, acrescentado no fim do ficheiro; Para abrir um ficheiro de texto, ao valor da <permissão> deve ser acrescentado p caráter 't', como por exemplo, 'wt' ou 'rt+'. Da mesma forma, para abrir um ficheiro binário, deve-se acrescentar ao valor de <permissão> o caráter 'b', como por exemplo, 'rb' ou rb+'. Se <permissão> for omitida, então será assumido o valor 'r'. Se não for especificado o tipo de ficheiro com um dos carateres 't' ou 'b', assume-se que os ficheiros são binários. Caso a função fopen tenha sucesso ao abrir o ficheiro, esta retornará o identificador de ficheiro <fid> com um número inteiro maior do que 2 e o conteúdo de <mensagem> será vazio. O <fid> será usado com outras funções de entrada e saída para identificar o ficheiro no qual as operações serão realizadas. No entanto, se esta função não tiver sucesso, então <fid> = -1 e <mensagem> conterá uma cadeia de carateres (string) informando o tipo de erro ocorrido. - 26 - Comandos de leitura e escrita de dados formatadas em ficheiros Exemplo 1 (o ficheiro "entrada1.txt" não existe): programa: [f, erro] = fopen('entrada1.txt', 'r') resultado da execução: f = -1 erro = Cannot open file. Existence? Permissions? Memory? . . . Exemplo 2 (o ficheiro "entrada.txt" existe): programa: [f, erro] = fopen('entrada.txt', 'r') resultado da execução: f = 3 erro = '' 20.2. Fecho de um ficheiro A função fclose fecha o ficheiro previamente aberto pela função fopen com base no seu número de identifcação. A sua sintaxe é a seguinte: [<variável>] = fclose (<fid>) em que <fid> é a variiável que contém o identificador de um ficheiro aberto comfopen, e <variável> recebe o valor que esta função retorna, que é 0, em caso de sucesso no fecho do ficheiro, e -1, em caso de insucesso. Por outro lado, a chamada à função fclose ('all') fecha todos os ficheiros abertos com fopen. Quando um ficheiro é fechado, a associação entre o identificador <fid> e o ficheiro físico <nome_ficheiro> é desfeita. 20.3. Leitura de dados de um ficheiro A função fscanf efetua a leitura de dados formatados de um ficheiro. A sua sintaxe é a seguinte: [<variável>, <tamanho>] = fscanf (<fid>, <formato>, <elementos>) em que <fid> é o identificador associado ao ficheiro onde se está a fazer a leitura dos dados escritos no formato especificado por <formato> e atribuídos à <variável>. O argumento <tamanho> é opcional e recebe o valor devolvido pela função que representa o número de elementos lidos com sucesso; O argumento <elementos> é opcional e indica o limite para o número de valores a serem lidos do ficheiro. O argumento <formato> pode assumir um dos seguintes valores: %ni : usado para valores inteiros, sendo n o tamanho do campo de apresentação; %n.df : notação na forma [-]888.88, sendo n o tamanho do campo (número total de carateres apresentados) e d o número de dígitos decimais; - 27 - Comandos de leitura e escrita de dados formatadas em ficheiros %n.de : notação na forma [-]8.888e88, sendo n o tamanho do campo (número total de carateres apresentados) e d o número de dígitos decimais; %n.dg : equivalete a %n.de ou %n.df, dependendo do formato mais curto; além disso, os zeros insignificantes não são apresentados; %ns : apresenta os carateres num campo de tamanho n. Por sua vez, o argumento <elementos> pode assumir um dos seguintes valores: n : lê até n valores num vetor coluna; inf : lê até ao fim do ficheiro, resultando num vetor coluna contendo o mesmo número de elementos do ficheiro; [m, n] : lê os valores suficientes para preencher uma matriz de dimensão (m x n), preenchendo esta matriz por coluna; n pode ser igual a inf mas não pode ser igual a m. Aquando da leitura dos dados do ficheiro, o MatLab tentará combinar os dados do ficheiro com a forma especificada em <formato>. Se a combinação ocorrer então os dados serão atribuídos por coluna à <variável>. Se a combinação ocorrer apenas parcialmente, então apenas os dados combinados com o <formato> serão atribuídos à variável e a operação de leitura será interrompida. Exemplo: programa: [f, erro] = fopen('entrada.txt', 'r'); if f == -1 error('Ficheiro nao aberto com sucesso'); end; [X, num] = fscanf(f, '%2i', [3, 5]); fclose(f); X num resultado da execução: X = 1 4 7 10 13 2 5 8 11 14 3 6 9 12 15 num = 15 A função fgetl efetua a leitura de uma linha de texto de um ficheiro para uma string, desprezando o carácter de quebra de linha (newline). A sua sintaxe é a seguinte: [<variável>] = fgetl(<fid>) em que <fid> é o identificador associado ao ficheiro onde se está a fazer a leitura da linha de texto, a qual é atribuída à <variável> (do tipo string). Se for encontrado o indicador de fim do ficheiro, é atribuído à <variável> o valor -1. Por exemplo, o código seguinte lê cada uma das linhas do ficheiro "dados.txt", usando a função fgetl, e coloca os dois números nela contidos (um inteiro e um real) numa estrutura com dois campos (Numero e Nota), usando uma função para manipulação de strings (strtok). - 28 - Comandos de leitura e escrita de dados formatadas em ficheiros programa: f = fopen('dados.txt', 'r'); tam = 0; linha = fgetl(f); while linha ~= -1 tam = tam + 1; [num rem] = strtok(linha); X(tam).Numero = str2num(num); X(tam).Nota = str2num(rem); linha = fgetl(f); end; fclose(f); for i = 1:tam fprintf('%8i %8.2f\n', X(i).Numero, X(i).Nota); end; resultado da execução: 23457 15.71 34527 17.95 45637 14.55 24763 15.45 A função fgets efetua a leitura de uma linha de texto de um ficheiro para uma string, incluindo o carácter de quebra de linha (newline). A sua sintaxe apresenta duas forma, que são as seguintes: [<variável>] = fgetl(<fid>) [<variável>] = fgetl(<fid>, <nchar>) em que <fid> é o identificador associado ao ficheiro onde se está a fazer a leitura da linha de texto, a qual é atribuída à <variável> (do tipo string). No segundo caso, lê no máximo <nchar> caracteres, continando a leitura no caracter seguinte. Se for encontrado o indicador de fim do ficheiro, é atribuído à <variável> o valor -1. A função textread lê os dados de um ficheiro e guarda-os em várias variévis, é um especificador de formato semelhante ao da função fprintf que é utilizado para separar os dados de tipos distintos em células distintas. A sua sintaxe tem as seguintes formas: [<lista_variáveis>] = textread (<nome_ficheiro>, <formatos>, <N>) em que <nome_ficheiro> é o nome do ficheiro donde se pretende ler os dados, os quais são atribuídos à <lista_variáveis>, com os formatos especificados em <formatos>. Os valores possíveis para o argumento <formatos> são os mesmos usados para o argumento <formato> da função fscanf. O argumento <N> é um valor inteiro opcional que, quando positivo não nulo (> 0) significa que o <formato> é reutilizado N vezes, e quando negativo que são lidos todos os dados do ficheiro. Por exemplo, o código seguinte lê todos os dados do ficheiro "dados.txt", usando a função textread, e coloca o primeiro e terceiro números de cada linha (um inteiro e um real) em dois vetores (Numeros e Notas), desprezando o segundo número (um real). - 29 - Comandos de leitura e escrita de dados formatadas em ficheiros programa: f = fopen('dados.txt', 'r'); [Numeros Notas] = textread('dados.txt', '%d %*f %f'); fclose(f); tam = length(Numeros); for i = 1:tam fprintf('%8i %8.2f\n', Numeros(i), Notas(i)); end; resultado da execução: 23457 12.85 34527 16.12 45637 18.64 24763 14.76 20.4. Escrita de dados num ficheiro A função fprintf permite guardar dados formatados num ficheiro que está numa unidade de armazenamento externo. A sua sintaxe é a seguinte: <tamanho> = fprintf (<fid>, <formatos>, <lista_variáveis>) em que <tamanho> (opcional) recebe o número de bytes escritos, <fid> é o identificador associado ao ficheiro onde se pretende guardar os dados, os quais estão contidos na <lista_variáveis>, com os formatos especificados em <formatos>. Os valores possíveis para o argumento <formatos> são os mesmos usados para o argumento <formato> da função fscanf. Se o argumento <fid> for omitido ou se <fid> = 1, então os valores serão apresentados no monitor. Exemplo 1: programa: [f, erro] = fopen ('saida1.txt', 'w'); if f ~= -1 A = [16 3 2; 5 10 8; 9 6 7; 4 14 1]; num = fprintf(f, '%3i', A); fclose(f); num end; resultado da execução: num = 36 Exemplo 2: programa: [f, erro] = fopen('saida1.txt', 'w'); if f ~= -1 X1 = 10; X2 = 20; X3 = 30; fprintf(f, '%7.4f %6.3f %5.2f\n', X1, X2, X3); fclose(f); end; resultado da execução: - 30 - Comandos de leitura e escrita de dados formatadas em ficheiros 20.5. Verificar fim de um ficheiro de leitura A função feof verifica se o último registo de um ficheiro, que foi aberto com fopen, foi lido (ou seja, se já se atingiu o final do ficheiro). A sua sintaxe é a seguinte: <variável_retorno> = feof (<fid>) em que <fid> é o identificador do ficheiro em análise e <variável_retorno> recebe o valor 1, se foi lido o último registo, ou 0, caso contrário. 21. Estruturas Uma estrutura (struct) é um tipo de dados composto que permite armazenar dados de váriostipos (os tipos básicos só permitem de um único tipo). Um estrutura é definida por um ou vários campos (fields) de qualquer tipo de dados. Para se aceder aos campos de uma estrutura, utiliza-se um ponto (.) depois do nome da variável, seguido pelo nome do campo, da seguinte forma: variável.campo Uma variável pode ser definida como uma estrutura de duas formas: a) usando instruções de atribuição e b) usando a função struct. 21.1. Construção de uma estrutura usando instruções de atribuição Pode-se definir uma variável simples como uma estrutura atribuindo individualmente valores aos seus campos; o MatLab cria automaticamente a estrutura que se pretende. A sintaxe é a seguinte: variável_estrutura.campo1 = valor1; . . . variável_estrutura.campoN = valorN; Por exemplo, definir a variável aluno como uma estrutura com três campos: nome (vetor de caracteres – string), numero (número inteiro) e testes (vetor de 3 reais = matriz de reais 1x3). programa: aluno.nome = 'Carlos Soares'; aluno.numero = uint16(34127); aluno.testes = [14.5 16.7 15.6]; aluno resultado da execução: aluno = nome: 'Carlos Soares' numero: 34127 testes: [14.5000 16.7000 15.6000] As estruturas podem ser vetores ou matrizes. Por exemplo, um vetor de alunos em que cada aluno é uma estrutura com três campos: nome, numero e testes. programa: aluno(1).nome = 'Carlos Soares'; aluno(1).numero = uint16(34127); aluno(1).testes = [14.5 16.7 15.6]; aluno(2).nome = 'Ana Sousa'; aluno(2).numero = uint16(34925); resultado da execução: aluno = 1x2 struct array with fields: nome numero testes - 31 - Estruturas aluno(2).testes = [13.2 18.4 15.3]; aluno disp('Aluno 1:'); disp(aluno(1)); disp('Aluno 2:'); disp(aluno(2)); Aluno 1: nome: 'Carlos Soares' numero: 34127 testes: [14.5000 16.7000 15.6000] Aluno 2: nome: 'Ana Sousa' numero: 34925 testes: [13.2000 18.4000 15.3000] 21.2. Construção de uma estrutura usando a função struct A função struct pode ser usada de duas formas: a) criar uma estrutura vazia defindo apenas os seus campos, cuja sintaxe é a seguinte: variável_estrutura = struct (’campo1’, { }, ’campo2’, { }, ...) em que variável_estrutura só pode ser definida como matriz ou vetor (não variável simples). b) criar uma estrutura com os seus campos e respetivos valores, cuja sintaxe é a seguinte: variável_estrutura = struct (’campo1’, valor1, ’campo2’, valor2, ...) Exemplo 1: definir a variável aluno como uma estrutura com três campos (nome, numero e testes), mas sem valores atribuídos aos seus campos (campos vazios). programa: aluno = struct ('nome', { }, 'numero', ... { }, 'testes', { }); aluno aluno(1).nome = 'Carlos Soares'; aluno(1).numero = uint16(34127); aluno(1).testes = [14.5 16.7 16.6]; disp('Aluno 1:'); disp(aluno(1)); resultado da execução: aluno = 0x0 struct array with fields: nome numero testes Aluno 1: nome: 'Carlos Soares' numero: 34127 testes: [14.5000 16.7000 16.6000] Exemplo 2: definir a variável aluno como uma estrutura com três campos (nome, numero e testes), mas com valores atribuídos aos seus campos. programa: aluno = struct ('nome', 'Carlos Soares', ... 'numero', uint16(34127), ... 'testes', [14.5 16.7 16.6]); aluno aluno.nome = 'Ana Sousa'; resultado da execução: aluno = nome: 'Carlos Soares' numero: 34127 testes: [14.5000 16.7000 16.6000] aluno - 32 - Estruturas aluno.numero = uint16(34925); aluno.testes = [13.2 18.4 15.3]; aluno aluno(2).nome = 'Carlos Soares'; aluno(2).numero = uint16(34127); aluno(2).testes = [14.5 16.7 16.6]; disp('Aluno 1:'); disp(aluno(1)); disp('Aluno 2:'); disp(aluno(2)); nome: 'Ana Sousa' numero: 34925 testes: [13.2000 18.4000 15.3000] Aluno 1: nome: 'Ana Sousa' numero: 34925 testes: [13.2000 18.4000 15.3000] Aluno 2: nome: 'Carlos Soares' numero: 34127 testes: [14.5000 16.7000 16.6000] 21.3. Acesso aos dados das estruturas Depois de construídas as estruturas, pode-se aceder aos elementos dos seus campos de várias formas. Por exemplo, podem-se extrair várias estruturas de uma só vez. Exemplo: partindo do exemplo anterior, criar um vector com todos os números de aluno (campo numero): programa: aluno = struct ('nome', {}, 'numero', {}, 'testes', {}); aluno(1).nome = 'Carlos Soares'; aluno(1).numero = uint16(34127); aluno(1).testes = [14.5 16.7 16.6]; aluno(2).nome = 'Ana Sousa'; aluno(2).numero = uint16(34925); aluno(2).testes = [13.2 18.4 15.3]; Numeros = [aluno.numero]; Numeros resultado da execução: Numeros = 34127 34925 21.4. Acrescentar campos a uma estrutura Pode-se acrescentar um campo a uma estrutura adicionando esse novo campo à estrutura, usando uma instrução de atribuição. Exemplo: acrescenar o ano de nascimento do aluno (ssn) a um aluno (exemplo anterior): programa: aluno = struct ('nome', 'Carlos Soares', ... 'numero', uint16(34127), ... 'testes', [14.5 16.7 16.6]); aluno resultado da execução: aluno = nome: 'Carlos Soares' numero: 34127 testes: [14.5000 16.7000 16.6000] - 33 - Estruturas aluno.anoNasc = 1995; aluno aluno = nome: 'Carlos Soares' numero: 34127 testes: [14.5000 16.7000 16.6000] anoNasc: 1995 21.5. Eliminar campos de uma estrutura Para eliminar um campo de uma estrutura, utiliza-se a função rmfield. A sintaxe desta função é a seguinte: variável_estrutura_2 = rmfield (variável_estrutura_1, 'campo') em que variável_estrutura_1 e variável_estrutura_2 podem ser a mesma e campo é o campo que se pretende eliminar. Exemplo: programa: aluno1.nome = 'Ana Sousa'; aluno1.numero = uint16(34925); aluno1.testes = [13.2 18.4 15.3]; aluno1 aluno2 = rmfield(aluno1, 'numero'); aluno2 aluno1 = rmfield(aluno1, 'nome'); aluno1 resultado da execução: aluno1 = nome: 'Ana Sousa' numero: 34925 testes: [13.2000 18.4000 15.3000] aluno2 = nome: 'Ana Sousa' testes: [13.2000 18.4000 15.3000] aluno1 = numero: 34925 testes: [13.2000 18.4000 15.3000] 21.6. Matriz de células (cells array) Tal como uma estrutura, uma matrize de células é um tipo de dados composto que permitem armazenar dados de vários tipos (e não apenas de um só tipo, como acontece com os tipos de dados básicos). As células são armazenadas de forma semelhante às matrizes numéricas. Por exemplo, uma matriz de células pode conter numa célula uma matriz de reais, numa outra uma matriz de inteiros, numa outra um vetor de strings, numa outra uma matriz de números complexos, numa outra uma estrutura, numa outra uma matriz de células, etc. Cell 1,1 1.6 2.3 3.0 6.0 5.1 4.3 7.8 8.2 9.5 Cell 1,2 'Carlos Antunes' 'Covilha' '24-06-2016' Cell 1,3 2.5 + 3 i 5 – 8 i 26 + 5 i 7 + 0.5 i - 34 - Estruturas Cell 2,1 [ 2.54 8.65 5.43 ] Cell 2,2 12 43 58 8 76 25 39 7 3 Cell 2,3 'Texto' 2 5 7 3 [ 2 5 8 ] 2.5 + 6.5 i 21.6.1. Criar uma matriz de células Uma matriz de células pode ser criada usando instruções de atribuição ou usando a função cell para alocar previamente a matriz (as células da matriz ficam vazias) e posteriormente atribuir dados às suas células. a) Criar uma célula de cada vez usando instruções de atribuição Pode-se construir uma matriz de células atribuindo dados às suas células individualmente e uma de cada vez, usando instruções de atribuição. Assim, o MatLab define automaticamente a matriz pretendida.Existem duas formas de atribuir dados às célula usando instruções de atribuiçãos: por indexação das células ou por indexação dos conteúdos. No caso por indexação das células, os índices das células são delimitados por parêntesis curvos, "()", usando a notação padrão das matrizes. Os conteúdos das células da parte direita das instruções de atribuição são delimitados por chavetas, "{ }". - 35 - Estruturas Exemplo: criar uma matriz de células A de dimensão 2x2 programa: A(1,1) = {[1 4 3; 0 5 8; 7 2 9]}; A(1,2) = {'Carlos Antunes'}; A(2,1) = {3 + 7i}; A(2,2) = {10:10:50}; A celldisp(A); resultado da execução: A = [3x3 double] 'Carlos Antunes' [3.0000+ 7.0000i] [1x5 double] A{1,1} = 1 4 3 0 5 8 7 2 9 A{2,1} = 3.0000 + 7.0000 A{1,2} = Carlos Antunes A{2,2} = 10 20 30 40 50 No caso por indexação do conteúdo, os índices das matrizes são delimitados por chavetas, "{}", usando a notação padrão de matrizes. Os conteúdos das células são especificadas na parte direita da instrução de atribuição de forma normal (sem chavetas). Exemplo: criar uma matriz de células A de dimensão 2x2 (igual ao anterior) programa: B{1,1} = [1 4 3; 0 5 8; 7 2 9]; B{1,2} = 'Carlos Antunes'; B{2,1} = 3 + 7i; B{2,2} = 10:10:50; B celldisp(B); resultado da execução: B = [3x3 double] 'Carlos Antunes' [3.0000+ 7.0000i] [1x5 double] B{1,1} = 1 4 3 0 5 8 7 2 9 B{2,1} = 3.0000 + 7.0000i B{1,2} = Carlos Antunes B{2,2} = 10 20 30 40 50 Nota: A função celldisp (semelhante à função disp) mostra o conteúdo de cada célula da matriz de céluas. Por sua vez, a função cellplot mostra a arquitetura das células graficamente. - 36 - Estruturas Ao atribuir-se dados a uma célula de uma matriz de células com índices fora das dimensões daquela matriz, o MatLab expande e ajusta automaticamente a matriz de forma a incluir aqueles índices na sua nova dimensão; por sua vez, as restantes novas células são preenchidas com o vazio. Exemplos: transformar a matriz 2x2 do exemplo anterior numa matriz de 3x3 e de 3x2. Exemplo 1: >> B{3,3} = 5 B = [3x3 double] 'Carlos Antunes' [] [3.000+ 7.000i] [1x5 double] [] [] [] [5] Exemplo 2: >> B{3,2} = 5 B = [3x3 double] 'Carlos Antunes' [3.0000+ 7.0000i] [1x5 double] [] [ 5] b) Criar toda matriz usando uma instrução de atribuição Também se pode criar uma matriz de células com uma só instrução de atribuiçao (isto é, sem especificar explicitamente os índices da matriz), usando chavetas. Desta forma, as chavetas, "{ }", são construtores de matrizes de células, tal como os parêntesis retos são construtores de matrizes numéricas. Entre as chavetas usa-se vígulas ou espaços em branco para indicar quebras de coluna e pontos e vírgula para indicar quebras de linha entre células. Exemplo: >> C = {[1 2], [3 4]; [5 6], [7 8]} C = [1x2 double] [1x2 double] [1x2 double] [1x2 double] >> celldisp(C); C{1,1} = 1 2 C{2,1} = 5 6 C{1,2} = 3 4 C{2,2} = 7 8 c) Criar toda matriz usando a função cell A função cell permite alocar previamente uma matriz de células da dimensão especificada e com todas as suas células vazias. A sintaxe desta função tem as seguintes formas: c = cell(n) Cria uma matriz quadrada de ordem n, em que n é um escalar (se não for, surge um erro). Exemplo: >> A = cell(2) A = [] [] [] [] >> A = cell(T) ??? Undefined function or variable 'T'. >> A = cell('2') ??? Error using ==> cell Conversion to cell from char is not possible. - 37 - Estruturas c = cell(m,n) ou c = cell([m n]) Cria uma matriz de m linhas e n colunas (m x n), em que m e n são escalares. Exemplo: >> B = cell([2 5]) B = [] [] [] [] [] [] [] [] [] [] c = cell(m,n,p,...) ou c = cell([m n p ...]) Cria uma matriz de várias dimensões (m x n x p x ...) vazia, em que m, n, p, ... são escalares. c = cell(size(A)) Cria uma matriz vazia com a mesma dimensão de A Depois da matriz de células ser alocada, as suas células podem ser preenchidas individualmente, usando instruções de atribuição. Exemplo (criar uma matriz de células 2x3 vazia e preencher algumas delas): B = cell(2,3); B = cell(2,3); B(1,1) = {1:3}; B{1,3} = 'celula 1,3'; B(2,2) = {[1 2; 3 4]}; B celldisp(B); B = [1x3 double] [] 'celula 1,3' [] [2x2 double] [] B{1,1} = 1 2 3 B{2,1} = [] B{1,2} = [] B{2,2} = 1 2 3 4 B{1,3} = celula 1,3 B{2,3} = [] 21.7. Ober dados de uma matriz de células Pode-se obter dados de de uma matriz de células e armazená-los numa matriz simples ou numa nova célula de uma outra matriz. Isto pode ser feito com instruções de atribuição de duas formas: a) acedendo aos conteúdos das células usando indexação de conteúdos, ou b) acedendo a um subconjunto de células usando indexação de células. - 38 - Estruturas a) Aceder ao conteúdo de uma célula usando indexação de conteúdos Pode-se usar indexação de conteúdos na parte direita de uma instrução de atribuição para aceder a algum ou a todos os dados de uma qualquer célula e indicando a variável que recebe os dados na parte esquerda da instrução de atribuição. Os índices da matriz de células são referenciados entre chavetas, para indicar que se está a atribuir o conteúdo das células e não as próprias células. Exemplo: programa: A{1,1} = [1 4 3; 0 5 8; 7 2 9]; A{1,2} = 'Carlos Antunes'; A{2,1} = 3 + 7i; A{2,2} = 10:10:50; X = A{1,1} V = A{1,1}(2,2) resultado da execução: X = 1 4 3 0 5 8 7 2 9 V = 5 Nas atribuições, deve-se indicar explicitamente os índices de uma única célula e não de um subconjunto de células. Por exemplo, as atribuições A[1,:] = valor e B = A[1,:] são ambas invalidas. b) Aceder a um subconjunto de células usando indexação de células Usar a indexação de células para atribuir um qualquer conjunto de células a uma outra variável, criando uma nova matriz de células. Para tal, deve-se usar a vírgula para aceder aos subconjuntos de células dentro da matriz de células. Exemplo: programa: A{1,1} = [1 4 3; 0 5 8; 7 2 9]; A{1,2} = 'Carlos Antunes'; A{2,1} = 3 + 7i; A{2,2} = 10:10:50; B = A(2, 1:2) celldisp(B) resultado da execução: B = [3.0000+ 7.0000i] [1x5 double] B{1} = 3.0000 + 7.0000i B{2} = 10 20 30 40 50 21.7.1. Eliminando células Pode-se eliminar uma dimensão completa da matriz de células (linha ou coluna) tal como acontece com uma matriz normal. Para tal, basta indicar a linha ou a coluna que se pretende eliminar, colocando o índice entre parêntesis, e atribuir-lhe o vazio, da seguinte forma: A(indice_linha, :) = [] (eliminar uma linha) A(:, indice_coluna) = [] (eliminar uma coluna) - 39 - Estruturas Exemplo: programa: A{1,1} = [1 4 3; 0 5 8; 7 2 9]; A{1,2} = 'Carlos Antunes'; A{2,1} = 3 + 7i; A{2,2} = 10:10:50; B = A; A A(1, :) = []; A B(:, 2) = []; B resultado da execução: A = [3x3 double] 'Carlos Antunes' [3.0000+ 7.0000i] [1x5 double] A = [3.0000+ 7.0000i] [1x5 double] B =[3x3 double] [3.0000+ 7.0000i] 21.7.2. Remodelação de uma matriz de células Tal como outros tipos de matrizes, pode-se remodelar uma matriz de células usando a função reshape. O número de células mantém-se o mesmo, alterando apenas a sua disposição pelo nova matriz após remodelação; não se usa a função reshape para adicionar ou remover células. Exemplo: programa: A{1,1} = [1 4 3; 0 5 8; 7 2 9]; A{1,2} = 'Carlos Antunes'; A{2,1} = 3 + 7i; A{2,2} = 10:10:50; A B = reshape(A,1,4); B C = reshape(A,4,1); C A = reshape(A,1,4); A resultado da execução: A = [3x3 double] 'Carlos Antunes' [3.0000+ 7.0000i] [1x5 double] B = [3x3 double] [3.0000+ 7.0000i] 'Carlos Antunes' [1x5 double] C = [3x3 double] [3.0000+ 7.0000i] 'Carlos Antunes' [1x5 double] A = [3x3 double] [3.0000+ 7.0000i] 'Carlos Antunes' [1x5 double] 21.7.3. Matrizes de células de estruturas As matrizes de células podem armazenar grupos de estruturas com diferentes arquiteturas, em que cada arquitetura é composta por vários campos. O exemplo que se segue consiste em criar uma matriz de células com duas células (1 x 2), ou um vetor com duas células, em que cada uma delas contém uma estrutura diferentes entre si. - 40 - Estruturas Exemplo: programa: A = cell(1,2); A{1}.numero = int32(34216); A{1}.nome = 'Carlos Antunes'; A{2}.trabalhos = [0.7 0.5 1.0 0.3 0.5]; A{2}.frequencia = 8.5; A{2}.exame = 10.7; A{2}.final = []; A celldisp(A); resultado da execução: A = [1x1 struct] [1x1 struct] A{1} = numero: 34216 nome: 'Carlos Antunes' A{2} = trabalhos: [0.7000 0.5000 1 0.3000 0.5000] frequencia: 8.5000 exame: 10.7000 final: [] A célula 1 do vetor A contém uma estrutura com dois campos: um número inteiro e uma string. A célula 2 de A contém uma estrutura com três campos: um vetor de reais e dois números reais. Após a construção de uma matriz de células com estruturas, pode-se aceder aos conteúdos das suas células usando indexação dos conteúdos. A sua sintaxe é a seguinte: <matriz_celulas>{indice_celula}.campo Por exemplo, depois de se construir a matriz de células A (exemlo anterior), para se determinar a nota final (campo final da célula 2), deve-se aceder a toda a celula 2, tal como apresentado no exemplo seguinte: programa: notaT = 0; for i = 1:5 notaT = notaT + A{2}.trabalhos(i); end; if A{2}.frequencia > A{2}.exame A{2}.final = notaT + A{2}.frequencia; else A{2}.final = notaT + A{2}.exame; end; celldisp(A); resultado da execução: A{1} = numero: 34216 nome: 'Carlos Antunes' A{2} = trabalhos: [0.7000 0.5000 1 0.3000 0.5000] frequencia: 8.5000 exame: 10.7000 final: 13.7000 - 41 - Funções gráficas 22. Funções gráficas 22.1. Desenho de curvas A função plot serve para desenhar um gráfico bidimensional. Para desenhar um gráfico tridimensional, utiliza-se a função plot3. Para se desenhar uma curva bidimensional são necessários duas sequências de valores, uma para o eixo das abcissas (eixo dos XX) e outra para o eixo das ordenadas (eixo dos YY). Para tal, estas sequências de valores podem ser armazenadas em vetores ou em matrizes. 22.1.1. Utilização com vetores Quando se usam vetores, a função plot pode ser usada com as seguintes formas: plot (Y) Se Y é um vetor com N elementos, desenha uma curva em que os valores para o eixo das abcissas são os índices do vetor (1, 2, ..., N) e os valores para o eixo das ordenadas são os elementos do vetor Y. Desta forma, os N pontos considerados no gráfico são: (1, Y(1)), ...(N, Y(N)). plot (X, Y) Se X e Y são vetores com N elementos, desenha uma curva em que os valores para o eixo das abcissas são os elementos do vetor X e os valores para o eixo das ordenadas são os elementos do vetor Y. Assim, os N pontos considerados no gráfico são: (X(1), Y(1)), ...(X(N), Y(N)). plot (X1,Y1, X2, Y2, ..., Xn, Yn) Desenha n curvas tal que para a k-ésima curva os valores para o eixo das abcissas são os elementos do vetor Xk (Xk(1), ..., Xk(N)) e os valores para o eixo das ordenadas são os elementos do vetor Yk (Yk(1), ..., Yk(N)). Ou seja, é como aplicar a função plot n vezes sobre o mesmo gráfco: plot(X1, Y1), ..., plot(Xn, Yn). 22.1.2. Utilização com matrizes Quando se usam matrizes, a função plot pode ser usada com as seguintes formas: plot (Y) Se Y é uma mariz de m x n, desenha n curvas em que os valores para o eixo das abcissas são os índices das linhas da matriz (1, 2, ..., m) e os valores para o eixo das ordenadas são os elementos das colunas da matriz Y. Desta forma, para a k-ésima curva são usados os valores da coluna k da matriz Y (Y(1,k), ..., Y(m,k)); ou seja, os pontos envolvidos nesta curva são os seguintes: (1, Y(1,k)), ..., (m, Y(m,k)). plot (X, Y) Se X é um vetor com m elementos e Y uma matriz de m x n, desenha n curvas em que os valores para o eixo das abcissas são os os elementos do vetor X e os valores para o eixo das ordenadas são os elementos das colunas da matriz Y. Desta forma, para a k-ésima curva são usados os - 42 - Funções gráficas valores do vetor X e os valores da coluna k da matriz Y (Y(1,k), ..., Y(m,k)); ou seja, os pontos envolvidos nesta curva são os seguintes: (X(1), Y(1,k)), ..., (X(m), Y(m,k)). Se X é um vetor com n elementos e Y uma matriz de m x n, desenha m curvas em que os valores para o eixo das abcissas são os os elementos do vetor X e os valores para o eixo das ordenadas são os elementos das linhas da matriz Y. Ou seja, os pontos envolvidos nesta curva são os seguintes: (X(1), Y(k,1)), ..., (X(n), Y(k,n)). plot (X1,Y1, X2, Y2, ..., Xn, Yn) Se X e Y são matrizes de m x n, desenha n curvas em que para a k-ésima curva os valores para o eixo das abcissas são as colunas da matriz X e para o eixo das ordenadas são as colunas da matriz de Y. Ou seja, é como aplicar n vezes a função plot sobre o mesmo gráfco: plot(X1, Y1), ..., plot(Xn, Yn). A função plot3, para desenhar gráficos tridimensionais, funciona de forma semelhante à função plot, com a diferença que plot3 utiliza 3 parâmetros de dados. 22.2. Estilos de Linhas e Cores na função plot e plot3 Para além do parâmetro referente aos dados a serem apresentados no gráfico, essas funções possuem um outro parâmetro referente à cor e ao tipo de traço/linha. Desta forma, a sintaxe da função plot é a seguinte: plot (X, Y, config) em que config é um conjunto de símbolos que permitem alterar o estilo do gráfico. Estes símbolos estão associados à cor, ao marcador e ao tipo de linha a apresentar no gráfico. Se este parâmetro não for utilizado, a função plot assume a configuração padrão: linha azul e continua. As cores possíveis são as seguintes (símbolo): amarelo (y), lilás (m), azul claro (c), vermelho (r), verde (g), azul escuro (b), branco (w) e preto (k). Os marcadores possíveis são os seguintes (símbolo): ponto (.), estrela (*), círculo (º), + (+), x (x), quadrado (s), losango (d), triângulo para baixo (v), triângulo para cima (^), triângulo para a esquerda (<), triângulo para a direita (>), pentagrama (p) e hexagrama (h). Os tipos de linha possíveis são os seguintes (símbolo): linha contínua (-), linha tracejada (--), traços e pontos (-.) e linha pontilhada (:). Exemplo: >> X = 0:0.05:1; >> plot(X, X.^2, 'bd--'); X = 0 0.0500 0.1000 0.1500 0.2000 ... 0.8500 0.9000 0.9500 1.0000 X.^2 = 0 0.0025 0.0100 0.0225 0.0400 ... 0.7225 0.8100 0.9025 1.0000 - 43 - Funções gráficas
Compartilhar