módulo 7 aula expositiva 8 3.2 matrizes 3.2.1 atribuindo valores a uma matriz 3.2.2 vetores linha e...

Post on 22-Apr-2015

108 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related