Módulo 7 Aula Expositiva 8 3.2 Matrizes 3.2.1 Atribuindo valores a uma Matriz 3.2.2 Vetores Linha e Coluna 3.2.3 Referenciando Partes de uma Matriz 3.2.4 Aritmética Matricial 3.2.5 Construindo Matrizes 3.2.6 Matrizes e Gráficos 3.2.7 Matrizes de Strings e Arquivos 3.2.8 Matrizes Numéricas e Arquivos 3.2.9 Matrizes e Expressões Lógicas DCC 001 Programação de Computadores 2° Semestre de 2011 Prof. Osvaldo Carvalho Matrizes no Scilab Matrizes são valores compostos por outros valores (todos de um mesmo tipo) Manipulação de matrizes em Scilab (MatLab) mais flexível que em linguagens como C, Fortran, Java DCC001 2011-2 2 Criando uma Matriz Exemplo de valor de matriz 2 x 3, com linhas separadas por “;” -->A = [1 2 3; 4 5 6] A = 1. 4. DCC001 2011-2 2. 5. 3. 6. 3 Variável em Scilab é Matriz Toda variável em Scilab é uma matriz -->x = 7 x = 7. -->size(x) ans = 1. 1. --> DCC001 2011-2 Função size retorna número de linhas e de colunas do argumento x é uma matriz de uma linha e uma coluna! 4 Indexação -->A = [1 2 3; 4 5 6] A = 1. 4. 2. 5. 3. 6. -->e = A(2,3) e = 6. DCC001 2011-2 5 Modificação de elemento -->A(1,2) = 33 A DCC001 2011-2 = 1. 4. 33. 5. 3. 6. 6 Vetores Vetores: matrizes de uma única linha (ou coluna) -->v = [10 20 30] v = 10. 20. 30. -->u = [10; 20; 30] u = 10. Lembrando que o 20. “;” separa linhas 30. DCC001 2011-2 7 Atribuindo único valor a parte de matriz x = 23. 30. 29. 23. 93. 56. 21. 21. 48. 88. 31. 33. 65. 36. 59. -->x(2:4,3:5) = -1 x = 23. 23. 21. 88. 65. DCC001 2011-2 30. 93. 21. 31. 36. 29. - 1. - 1. - 1. 59. 50. 43. 26. 63. 40. 91. 4. 48. 26. 41. 28. 12. 77. 21. 11. 68. 15. 69. 84. 40. 50. - 1. - 1. - 1. 40. 91. - 1. - 1. - 1. 41. 28. 12. 77. 21. 11. 68. 15. 69. 84. 40. 8 Atribuindo matriz a parte de matriz x = 40. 58. 38. 73. 53. 87. 68. 92. 26. 11. 11. 89. 94. 49. 22. 19. 50. 34. 26. 62. 56. 34. 37. 52. 76. -->x(3:4,4:5) = [-1 -2;-3 -4] x = 40. 58. 38. 73. 53. 87. 68. 92. 26. 11. 11. 89. 94. - 1. - 2. 19. 50. 34. - 3. - 4. 56. 34. 37. 52. 76. DCC001 2011-2 4. 67. 20. 39. 83. 58. 48. 22. 84. 12. 4. 67. 20. 39. 83. 58. 48. 22. 84. 12. 9 Acesso a linha de matriz x = 21. 75. 0. 33. 66. 62. 84. 68. 87. 6. -->a = x(2,:) a = 75. DCC001 2011-2 84. 56. 66. 72. 19. 54. 23. 23. 21. 88. 65. 30. 93. 21. 31. 36. 29. 56. 48. 33. 59. 50. 43. 26. 63. 40. “:” designa todos os elementos de uma dimensão 66. 23. 93. 56. 43. 10 Acesso a linhas de parte de matriz x = 91. 4. 48. 26. 41. 28. 12. 77. 21. 11. 68. 15. 69. 84. 40. 40. 87. 11. 19. 56. 58. 68. 89. 50. 34. 38. 92. 94. 34. 37. 73. 26. 49. 26. 52. -->b = x(:,3:5) b = 68. 40. 58. 15. 87. 68. 69. 11. 89. 84. 19. 50. 40. 56. 34. DCC001 2011-2 11 Aritmética Matricial Como todas as variáveis Scilab são matrizes, operações aritméticas usuais (+,-,*,/,^) são entendidas como operações matriciais Ou seja: a*b representa o produto matricial da matriz a pela matriz b Operações escalares usam os mesmos símbolos, precedidos por “.”. Exemplos: .*, .^ etc. DCC001 2011-2 12 Adição e Subtração Requerem matrizes de mesmas dimensões -->x = [1 2 3; 4 5 6]; -->y = [10 20 30; 40 50 60]; -->x + y ans = 11. 22. 33. 44. 55. 66. -->x - y ans = - 9. - 18. - 27. - 36. - 45. - 54. DCC001 2011-2 13 Produto Matricial -->x = [1 2 3; 4 5 6] x = 1. 2. 3. 4. 5. 6. -->y = [10 20; 30 40; 50 60] y = 10. 20. 30. 40. 220 = 1x10 50. 60. -->x * y ans = 220. 280. 490. 640. DCC001 2011-2 + 2x30 + 3x50 14 Produto Elemento a Elemento -->x = [1 2; 3 4]; -->y = [10 20; 30 40]; -->x * y Produto ans = Matricial 70. 100. 150. 220. -->x .* y ans = Produto Elemento a 10. 40. Elemento 90. 160. DCC001 2011-2 15 Multiplicação de Matriz por Escalar -->x = [1 2 3; 4 5 6]; -->y = 2*x y = 2. 8. DCC001 2011-2 4. 10. 6. 12. 16 Exponenciação -->x = [1 2; 3 4]; -->x^2 Produto ans = Matricial x * x 7. 10. 15. 22. -->x .^ 2 ans = Exponenciação 1. 4. Elemento a Elemento 9. 16. DCC001 2011-2 17 Matriz Transposta A = 1. 2. 4. 5. 7. 33. -->B = A' B = 1. 4. 2. 5. 3. 6. DCC001 2011-2 3. 6. 9. A' é a transposta da matriz A 7. 33. 9. 18 Matriz Inversa – 1 A = 4. 7. 6. 2. 2. 1. 1. 1. 6. -->IA = inv(A) IA = - 0.3333333 1.0909091 0.3333333 - 0.5454545 0. - 0.0909091 DCC001 2011-2 0.1515152 - 0.2424242 0.1818182 19 Matriz Inversa – 2 -->A * IA ans = 1. 0. 1.110D-16 1. 5.551D-17 0. -->IA * A ans = 1. 8.327D-17 0. 1. 0. 0. DCC001 2011-2 Erro de Aproximação - 4.441D-16 - 1.110D-16 1. 0. 0. 1. 20 Sistemas de Equações Lineares Vamos resolver Onde, por exemplo, 𝑎= −2 2 −4 Usando DCC001 2011-2 −1 1 1 𝑎 −1 3 1 3 4 𝑏= 0 1 𝑎𝑥 = 𝑥 = 𝑎 −1 𝑏 21 Solução com Scilab -->a = [-2 -2 3; 2 1 1;-4 1 3]; -->b = [-4 0 1]'; -->x = inv(a)*b x = - 0.5 2. - 1. DCC001 2011-2 22 Verificando a Solução -->residuo = a*x - b residuo = 0. - 2.220D-16 0. DCC001 2011-2 23 Construção de Vetores “Regulares” Vetores com valores regularmente espaçados podem ser construídos de forma similar à utilizada no comando for -->x = 10:13 x = 10. 11. 12. 13. -->x = 12:-0.5:10 x = 12. 11.5 DCC001 2011-2 11. 10.5 10. 24 Revisitando o comando for O comando for i = [9 3 14] printf("%d, ",i) end Vetor com valores atribuídos imprime um a um à variável de controle 9, 3, 14, DCC001 2011-2 25 A Função linspace Pode ser conveniente gerar um vetor regular especificando seus limites e o número de pontos desejados Nro. de Pontos -->x = linspace(0,10,3) x = 0. 5. 10. Limites -->x = linspace(0,10,6) x = 0. 2. 4. 6. DCC001 2011-2 8. 10. 26 Zeros e Uns -->x = zeros(2,3) x = 0. 0. 0. 0. 0. 0. -->y = ones(2,3) y = 1. 1. 1. 1. 1. 1. DCC001 2011-2 27 Matriz Identidade -->I = eye(4,4) I = 1. 0. 0. 0. DCC001 2011-2 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 28 Matrizes Randômicas Gera números aleatórios entre 0e1 -->m = rand(2,3) m = 0.2113249 0.7560439 -->n = rand(2,3) n = 0.8497452 0.6857310 DCC001 2011-2 Novos números a cada chamada 0.0002211 0.3303271 0.6653811 0.6283918 0.8782165 0.0683740 0.5608486 0.6623569 29 Gerando Matrizes “Bonitinhas” Arredonda para o inteiro mais próximo Fator de Escala -->m = round(rand(2,3)*100) m = 21. 75. DCC001 2011-2 0. 33. 66. 62. 30 Construindo Matrizes a partir de Matrizes -->x = [1 2; 3 4]; -->y = [10 20; 30 40]; -->z = [x y] z = 1. 2. 10. 20. 3. 4. 30. 40. -->z = [x ; y] z = 1. 2. 3. 4. 10. 20. 30. 40. DCC001 2011-2 31 Funções Scilab são Matriciais! Se a função sqrt, por exemplo, for chamada com um argumento matricial, seu resultado também é uma matriz -->sqrt([4 9 16 25]) ans = 2. DCC001 2011-2 3. 4. 5. 32 Vetores e Gráficos Vetores são utilíssimos para a construção de DCC001 2011-2 gráficos O comando mais simples é plot2d(x,y), onde x e y são vetores com as mesmas dimensões O Scilab constrói um gráfico unindo por retas os pontos com coordenadas (x(1), y(1)), (x(2), y(2)), ... 33 Exemplo de gráfico -->x = [1 4 7 11]; y = [12 6 15 7]; -->plot2d(x,y) 7,15 15 14 13 1,12 12 11 10 9 8 11,7 7 6 DCC001 2011-2 1 4,6 2 3 4 5 6 7 8 9 10 11 34 Outro exemplo de gráfico -->x = [2 5 3 4]; y = [ 3 1 4 7]; -->plot2d(x,y) 4,7 3,4 2,3 DCC001 2011-2 5,1 35 Gráfico Seno(x) – Versão 1 -->x = 0:0.8:3*%pi; -->y = sin(x); -->plot2d(x,y) 1.0 0.8 0.6 0.4 0.2 O espaçamento de 0.8 está grande! 0.0 -0.2 -0.4 -0.6 -0.8 -1.0 0 DCC001 2011-2 1 2 3 4 5 6 7 8 9 36 Gráfico Seno(x) – Versão 2 -->x = 0:0.1:3*%pi; -->y = sin(x); -->plot2d(x,y 1.0 0.8 0.6 0.4 O espaçamento de 0.1 está bem melhor! 0.2 0.0 -0.2 -0.4 -0.6 -0.8 -1.0 0 DCC001 2011-2 1 2 3 4 5 6 7 8 9 10 37 Várias curvas em um gráfico A função plot2d pode ser usada para traçar várias curvas em um único gráfico plot2d(x,M), onde x é um vetor coluna M é uma matriz com o mesmo número de linhas de x faz um gráfico de x versus cada coluna de M DCC001 2011-2 38 Gráfico com várias curvas -->x = linspace(0, 3*%pi, 101)'; -->plot2d(x,[sin(x) sin(2*x) sin(3*x)]) 1.0 0.8 x é um vetor coluna (e sin(x), sin(2*x) e sin(3*x) também são) 0.6 0.4 0.2 0.0 -0.2 -0.4 -0.6 -0.8 -1.0 0 DCC001 2011-2 1 2 3 4 5 6 7 8 9 10 39 Matrizes de Strings -->a = ["s1" "s2"] a = !s1 s2 ! -->b = ["s1" ; "s2"] b = !s1 ! ! ! !s2 ! DCC001 2011-2 40 Leitura de Arquivos como Matrizes de Strings - 1 O comando s = mgetl(da) , onde da é o descritor de um arquivo já aberto, lê todas as linhas do arquivo da e coloca cada uma delas como um elemento do vetor coluna de strings s Uso típico: fpath = uigetfile() da = mopen(fpath,'r') linhas = mgetl(da); mclose(da); DCC001 2011-2 41 Leitura de Arquivos como Matrizes de Strings – 2 Este programa usado com o arquivo José produz: -->linhas linhas = !E agora, José? !A festa acabou, !a luz apagou, !o povo sumiu, !a noite esfriou, !e agora, José? !e agora, você? !você que é sem nome, !que zomba dos outros, !você que faz versos, !que ama, protesta? !e agora, José? DCC001 2011-2 ! ! ! ! ! ! ! ! ! ! ! ! 42 Matrizes Numéricas e Arquivos no Scilab Os comandos já vistos de leitura e gravação de arquivos podem ser usados para a leitura de matrizes, mas o Scilab oferece mecanismos mais simples através dos comandos fscanfMat e fprintfMat arquivos que contêm somente números em formato tabular, à exceção das Estes comandos lêm ou gravam primeiras linhas que podem conter textos. A abertura e o fechamento dos arquivos são feitas internamente pelas funções fscanfMat e fprintfMat DCC001 2011-2 43 O Comando fprintfMat - 1 fprintfMat(arq,r,'%5.2f', Cabecalho) Grava a matriz r no arquivo arq Cabecalho é um vetor de strings que são gravados nas primeiras linhas, e normalmente contém uma explicação sobre os campos presentes no arquivo. DCC001 2011-2 44 O Comando fprintfMat – 2 O programa a = [1 2 3; 4 5 6; 7 8 9]; arq = uigetfile(); Cabecalho = [" Meus Dados "; "Col1 Col2 Col3"] fprintfMat(arq,a,"%5.2f",Cabecalho); produz o arquivo DCC001 2011-2 45 O Comando fscanfMat r = fscanfMat(arq); Lê uma matriz do arquivo cujo nome completo é um string armazenado em arq Linhas com texto no início do arquivo são ignoradas DCC001 2011-2 46 O Comando fscanfMat O programa arquivo = uigetfile(); m = fscanfMat(arquivo) Escolhendo o arquivo anterior, produz a matriz m DCC001 2011-2 = 1. 4. 7. 2. 5. 8. 3. 6. 9. 47 Clima em Belo Horizonte: O Arquivo TempoBHZ.txt Aberto com o “Bloco de Notas” DCC001 2011-2 48 Clima em Belo Horizonte Faça um programa que: Leia este arquivo para uma matriz ClimaBH, usando a função fscanfMat, que ignora linhas de cabeçalho em um arquivo. Da matriz ClimaBH, extraia os vetores MaxMed, MinMed, MaxRec, MinRec e Precip, com significados óbvios. Gere um gráfico que tenha simultaneamente os valores de MaxMed, MinMed, MaxRec e MinRec. DCC001 2011-2 49 Clima em Belo Horizonte arqClima = uigetfile(title="Arquivo com dados do clima em BH: "); ClimaBH = fscanfMat(arqClima); MaxMed MinMed MaxRec MinRec Precip = = = = = ClimaBH(:,2); ClimaBH(:,3); ClimaBH(:,4); ClimaBH(:,5); ClimaBH(:,6); // // // // // MaxMed MinMed MaxRec MinRec Precip = = = = = 2a 3a 4a 5a 6a coluna coluna coluna coluna coluna plot2d([1:12],[MaxMed MinMed MaxRec MinRec],... leg="MaxMed@MinMed@MaxRec@MinRec") xtitle("Temperaturas Mensais em BH","Mês","Graus C"); DCC001 2011-2 50 Clima em Belo Horizonte Gráfico T emperaturas Mensais em BH 40 35 30 Graus C 25 20 15 10 5 0 0 DCC001 2011-2 2 MaxMed MinMed MaxRec 4 6 Mês 8 MinRec 10 12 51 Gráficos de Dados Experimentais O arquivo AcessosNotas.txt tem este formato Construir um gráfico que mostre estes dados DCC001 2011-2 52 Programa AcessosNotas.sce // Este programa lê o arquivo AcessosNotas.txt, // e produz um gráfico de dispersão dos dados arq = uigetfile("*.txt",pwd(), ... "Arquivo com Acessos e Notas"); AcessosNotas = fscanfMat(arq); Acessos = AcessosNotas(:,1); Notas = AcessosNotas(:,2); plot2d(Acessos,Notas,style=-1) xgrid() xtitle("Acessos versus Notas", ... "Número de Acessos","Aproveitamento") DCC001 2011-2 53 Resultado do programa AcessosNotas.sce DCC001 2011-2 54 Matrizes e Expressões Lógicas O resultado de uma expressão relacional envolvendo matrizes é uma matriz de booleanos -->a = [3 7;8 2] a = 3. 7. 8. 2. -->a > 5 ans = F T T F DCC001 2011-2 -->a = [3 7; 8 2]; -->b = [5 6; 7 8]; -->a > b ans = F T T F 55 Matrizes, Expressões Lógicas e o Comando if -->a = [3 -->x = 0; -->if a > -->if a > -->[x y] ans = 0. DCC001 2011-2 9; 12 1] y = 0; 5 then; x = 10000; end; 0 then; y = 10000; end; 10000. 56 Usando Matrizes Booleanas para designar elementos de uma Matriz Sejam X uma matriz de números reais, e mb uma matriz de booleanos com as mesmas dimensões de X X(mb) designa os elementos de X com correspondentes em mb iguais a %T -->a = [3 -->a(a>5) a = 3. - 1. DCC001 2011-2 9; 12 1]; = -1 1. 1. 57 Notas Matrizes são absolutamente essenciais para programas que tratam com problemas algébricos ou com tabelas A manipulação de matrizes é muito flexível no Scilab Matrizes são também essenciais para o desenho de gráficos no Scilab DCC001 2011-2 58