Upload
internet
View
108
Download
0
Embed Size (px)
Citation preview
Módulo 7Aula Expositiva 8
3.2 Matrizes3.2.1 Atribuindo valores a uma Matriz3.2.2 Vetores Linha e Coluna3.2.3 Referenciando Partes de uma Matriz3.2.4 Aritmética Matricial3.2.5 Construindo Matrizes3.2.6 Matrizes e Gráficos3.2.7 Matrizes de Strings e Arquivos3.2.8 Matrizes Numéricas e Arquivos3.2.9 Matrizes e Expressões Lógicas
DCC 001Programação de Computadores
2° Semestre de 2011Prof. 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. 2. 3. 4. 5. 6.
DCC001 2011-2 3
Variável em Scilab é Matriz
DCC001 2011-2 4
-->x = 7 x = 7.-->size(x) ans = 1. 1.-->
x é uma matriz de uma linha e uma
coluna!
Toda variável em Scilab é uma matriz
Função size retorna número de linhas e de colunas do argumento
Indexação
-->e = A(2,3) e = 6.
DCC001 2011-2 5
-->A = [1 2 3; 4 5 6] A = 1. 2. 3. 4. 5. 6.
Modificação de elemento
DCC001 2011-2 6
-->A(1,2) = 33
A = 1. 33. 3. 4. 5. 6.
Vetores Vetores: matrizes de uma única linha
(ou coluna)-->v = [10 20 30] v = 10. 20. 30.-->u = [10; 20; 30] u = 10. 20. 30.
Lembrando que o “;” separa linhas
DCC001 2011-2 7
Atribuindo único valor a parte de matriz
x = 23. 30. 29. 50. 91. 28. 68. 23. 93. 56. 43. 4. 12. 15. 21. 21. 48. 26. 48. 77. 69. 88. 31. 33. 63. 26. 21. 84. 65. 36. 59. 40. 41. 11. 40.-->x(2:4,3:5) = -1 x =
23. 30. 29. 50. 91. 28. 68. 23. 93. - 1. - 1. - 1. 12. 15. 21. 21. - 1. - 1. - 1. 77. 69. 88. 31. - 1. - 1. - 1. 21. 84. 65. 36. 59. 40. 41. 11. 40.
DCC001 2011-2 8
Atribuindo matriz a parte de matriz
x = 40. 58. 38. 73. 53. 4. 58. 87. 68. 92. 26. 11. 67. 48. 11. 89. 94. 49. 22. 20. 22. 19. 50. 34. 26. 62. 39. 84. 56. 34. 37. 52. 76. 83. 12.-->x(3:4,4:5) = [-1 -2;-3 -4] x = 40. 58. 38. 73. 53. 4. 58. 87. 68. 92. 26. 11. 67. 48. 11. 89. 94. - 1. - 2. 20. 22. 19. 50. 34. - 3. - 4. 39. 84. 56. 34. 37. 52. 76. 83. 12.
DCC001 2011-2 9
x =
21. 62. 56. 23. 30. 29. 50. 75. 84. 66. 23. 93. 56. 43. 0. 68. 72. 21. 21. 48. 26. 33. 87. 19. 88. 31. 33. 63. 66. 6. 54. 65. 36. 59. 40.
-->a = x(2,:) a =
75. 84. 66. 23. 93. 56. 43.
Acesso a linha de matriz
x =
21. 62. 56. 23. 30. 29. 50. 75. 84. 66. 23. 93. 56. 43. 0. 68. 72. 21. 21. 48. 26. 33. 87. 19. 88. 31. 33. 63. 66. 6. 54. 65. 36. 59. 40.
-->a = x(2,:) a =
75. 84. 66. 23. 93. 56. 43.
DCC001 2011-2 10
“:” designa todos os elementos de uma dimensão
Acesso a linhas de parte de matriz
x = 91. 28. 68. 40. 58. 38. 73. 4. 12. 15. 87. 68. 92. 26. 48. 77. 69. 11. 89. 94. 49. 26. 21. 84. 19. 50. 34. 26. 41. 11. 40. 56. 34. 37. 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. 50. 60.-->x * y ans = 220. 280. 490. 640.
220 = 1x10 + 2x30 + 3x50
DCC001 2011-2 14
-->x = [1 2; 3 4];-->y = [10 20; 30 40];-->x * y ans = 70. 100. 150. 220.-->x .* y ans = 10. 40. 90. 160.
Produto Elemento a Elemento
Produto Matricial
Produto Elemento a Elemento
DCC001 2011-2 15
Multiplicação de Matriz por Escalar
-->x = [1 2 3; 4 5 6];
-->y = 2*x y =
2. 4. 6. 8. 10. 12.
DCC001 2011-2 16
Exponenciação
-->x = [1 2; 3 4];-->x^2 ans = 7. 10. 15. 22.-->x .^ 2 ans = 1. 4. 9. 16.
Produto Matricial x * x
Exponenciação Elemento a Elemento
DCC001 2011-2 17
Matriz Transposta
A = 1. 2. 3. 4. 5. 6. 7. 33. 9.-->B = A' B = 1. 4. 7. 2. 5. 33. 3. 6. 9.
A' é a transposta da matriz A
DCC001 2011-2 18
Matriz Inversa – 1
A = 4. 7. 6. 2. 2. 1. 1. 1. 6.-->IA = inv(A) IA = - 0.3333333 1.0909091 0.1515152 0.3333333 - 0.5454545 - 0.2424242 0. - 0.0909091 0.1818182
DCC001 2011-2 19
Matriz Inversa – 2
-->A * IA ans = 1. 0. - 4.441D-16 1.110D-16 1. - 1.110D-16 5.551D-17 0. 1.-->IA * A ans = 1. 8.327D-17 0. 0. 1. 0. 0. 0. 1.
Erro de Aproximação
DCC001 2011-2 20
Vamos resolver Onde, por exemplo,
Usando
Sistemas de Equações Lineares
DCC001 2011-2 21
𝑎 = −2 −1 32 1 1−4 1 3൩ 𝑏= 401൩ 𝑎−1𝑎𝑥= 𝑥= 𝑎−1𝑏
Solução com Scilab
DCC001 2011-2 22
-->a = [-2 -2 3; 2 1 1;-4 1 3];-->b = [-4 0 1]';
-->x = inv(a)*b x = - 0.5 2. - 1.
Verificando a Solução
DCC001 2011-2 23
-->residuo = a*x - b residuo = 0. - 2.220D-16 0.
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 11. 10.5 10.
DCC001 2011-2 24
Revisitando o comando for
DCC001 2011-2 25
for i = [9 3 14] printf("%d, ",i)end
O comando
imprime
9, 3, 14,
Vetor com valores atribuídos um a um à variável de controle
A Função linspace
-->x = linspace(0,10,3) x = 0. 5. 10. -->x = linspace(0,10,6) x = 0. 2. 4. 6. 8. 10.
Limites
Nro. de Pontos
Pode ser conveniente gerar um vetor regular especificando seus limites e o número de pontos desejados
DCC001 2011-2 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. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1.
DCC001 2011-2 28
Matrizes Randômicas
-->m = rand(2,3) m = 0.2113249 0.0002211 0.6653811 0.7560439 0.3303271 0.6283918-->n = rand(2,3) n = 0.8497452 0.8782165 0.5608486 0.6857310 0.0683740 0.6623569
Gera números aleatórios entre
0 e 1Novos números
a cada chamada
DCC001 2011-2 29
Gerando Matrizes “Bonitinhas”
DCC001 2011-2 30
-->m = round(rand(2,3)*100) m = 21. 0. 66. 75. 33. 62.
Arredonda para o inteiro mais próximo
Fator de Escala
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!
-->sqrt([4 9 16 25]) ans = 2. 3. 4. 5.
Se a função sqrt, por exemplo, for chamada com um argumento matricial, seu resultado também é uma matriz
DCC001 2011-2 32
Vetores e Gráficos Vetores são utilíssimos para a
construção de 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)), ...
DCC001 2011-2 33
Exemplo de gráfico-->x = [1 4 7 11]; y = [12 6 15 7];
-->plot2d(x,y)
1 2 3 4 5 6 7 8 9 10 116
7
8
9
10
11
12
13
14
15
1,12
4,6
7,15
11,7
DCC001 2011-2 34
Outro exemplo de gráfico
DCC001 2011-2
2,3
-->x = [2 5 3 4]; y = [ 3 1 4 7];
-->plot2d(x,y)
5,1
3,4
4,7
35
Gráfico Seno(x) – Versão 1
-->x = 0:0.8:3*%pi;-->y = sin(x);-->plot2d(x,y)
0 1 2 3 4 5 6 7 8 9-1.0
-0.8
-0.6
-0.4
-0.2
0.0
0.2
0.4
0.6
0.8
1.0
O espaçamento de 0.8 está
grande!
DCC001 2011-2 36
Gráfico Seno(x) – Versão 2
-->x = 0:0.1:3*%pi;-->y = sin(x);-->plot2d(x,y
0 1 2 3 4 5 6 7 8 9 10-1.0
-0.8
-0.6
-0.4
-0.2
0.0
0.2
0.4
0.6
0.8
1.0
DCC001 2011-2 37
O espaçamento de 0.1 está bem
melhor!
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)])
0 1 2 3 4 5 6 7 8 9 10-1.0
-0.8
-0.6
-0.4
-0.2
0.0
0.2
0.4
0.6
0.8
1.0
x é um vetor coluna (e sin(x),
sin(2*x) e sin(3*x)
também são)
DCC001 2011-2 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
fpath = uigetfile()da = mopen(fpath,'r')linhas = mgetl(da);mclose(da);
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:
DCC001 2011-2 41
Leitura de Arquivos como Matrizes de Strings – 2
-->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é? !
Este programa usado com o arquivo José produz:
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
Estes comandos lêm ou gravam arquivos que contêm somente números em formato tabular, à exceção das primeiras linhas que podem conter textos.
A abertura e o fechamento dos arquivos são feitas internamente pelas funções fscanfMat e fprintfMatDCC001 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 programa
produz o arquivo
O Comando fprintfMat – 2
a = [1 2 3; 4 5 6; 7 8 9];arq = uigetfile();Cabecalho = [" Meus Dados "; "Col1 Col2 Col3"] fprintfMat(arq,a,"%5.2f",Cabecalho);
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 programa
Escolhendo o arquivo anterior, produz a matriz
O Comando fscanfMat
arquivo = uigetfile();m = fscanfMat(arquivo)
m = 1. 2. 3. 4. 5. 6. 7. 8. 9.
DCC001 2011-2 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 = ClimaBH(:,2); // MaxMed = 2a colunaMinMed = ClimaBH(:,3); // MinMed = 3a colunaMaxRec = ClimaBH(:,4); // MaxRec = 4a colunaMinRec = ClimaBH(:,5); // MinRec = 5a colunaPrecip = ClimaBH(:,6); // Precip = 6a 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 HorizonteGráfico
MaxMedMinMedMaxRec
MinRec
0 2 4 6 8 10 120
5
10
15
20
25
30
35
40
Temperaturas Mensais em BH
Mês
Gra
us C
DCC001 2011-2 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
DCC001 2011-2 53
// 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")
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
55DCC001 2011-2
-->a = [3 7;8 2]
a =
3. 7.
8. 2.
-->a > 5
ans =
F T
T F
-->a = [3 7; 8 2];
-->b = [5 6; 7 8];
-->a > b
ans =
F T
T F
Matrizes, Expressões Lógicas e o Comando if
-->a = [3 9; 12 1]-->x = 0; y = 0;-->if a > 5 then; x = 10000; end;-->if a > 0 then; y = 10000; end;-->[x y] ans = 0. 10000.
56DCC001 2011-2
Usando Matrizes Booleanas para designar elementos de uma Matriz
-->a = [3 9; 12 1];-->a(a>5) = -1 a = 3. - 1. - 1. 1.
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
57DCC001 2011-2
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