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