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
Download

Módulo_07_2011