Você está na página 1de 18

Captulo 4

Matrizes
Matrizes so agregados de dados dentro de uma mesma varivel. Diferente de outros tipos de agregados de dados (que sero mostrados adiante), matrizes so agregados de dados homogneos no sentido de que os dados tm mesmo tipo de contedo, ou seja, uma matriz pode conter somente dados numricos ou somente strings, mas no os dois simultaneamente. Na literatura de informtica, matrizes so, tambm, conhecidas por vrios outros nomes como, por exemplo, variveis composta homognea, variveis subscritas, variveis indexadas, arranjos, arrays, etc... O Scilab pode manipular uma matriz da mesma forma que uma linguagem de programao tradicional (isto , como um simples agregado de dados). No entanto, o Scilab tambm pode manipular matrizes de outra forma: exatamente como se fossem as matrizes da matemtica. Desta forma, o Scilab pode calcular o determinante ou a inversa de uma matriz bem como realizar operaes como multiplicao e soma matricial. Esta ltima forma de manipular matrizes no ser vista neste captulo. Ao contrrio, neste captulo, as matrizes sero manipuladas como simples agregados de dados do ponto de vista de uma linguagem de programao tradicional (na qual as operaes matriciais so realizadas elemento por elemento).

4.1

Matrizes Unidimensionais

Matrizes unidimensionais so chamados de vetores. Em um vetor possvel armazenar vrios itens em uma nica varivel. Na Figura 4.1 mostrada uma varivel nota contendo as notas de alunos. Os itens contidos em um vetor so chamados de elementos do vetor. Portanto, o vetor nota possui dez elementos. Seus elementos podem ser acessados individualmente. Por exemplo, nota(4) refere-se ao quarto elemento do vetor nota. O valor entre os parnteses de nota(4) chamado de ndice ou subscrito e usado para individualizar um elemento do vetor. Vetores podem ser criados no Scilab usando os colchetes [ e ]. Os elementos de um vetor so envolvidos por colchetes e so separados espaos (ou uma vrgula). Exemplo,
-->nota = [8.1 5.2 9.2 7.2 6.5 5.2 8.5 9.5 6.5 10.0];

Pode-se acessar elementos individuais:


-->nota(2) ans =

36

4.1 Matrizes Unidimensionais / UFRN-DCA - 26 de Abril de 2004

37

Figura 4.1: Vetor com dez elementos

5.2 -->nota(5) ans = 6.5 -->nota(8) ans = 9.5

Pode-se somar as trs primeiras notas do seguinte modo:


-->nota(1) + nota(2) + nota(3) ans = 22.5

Uma aplicao natural de vetores armazenar variveis indexadas da matemtica. Por exemplo, as variveis indexadas x1 = 2, x2 = 4, x3 = 2 e x4 = 3 so armazenadas no Scilab como:
-->x(1) = 2; -->x(2) = 4; -->x(3) = 2; -->x(4) = 3;

ou equivalentemente como
-->x = [2 4 2 3];

Expresses matemticas tais como (x1 + x3 )/x2 so efetuados do seguinte modo:

4.1 Matrizes Unidimensionais / UFRN-DCA - 26 de Abril de 2004

38

-->(x(1)+x(3))/x(2) ans = 1.

4.1.1

Acessando Elementos do Vetor

Os elementos de um vetor podem ser acessados de vrias maneiras. Por exemplo, considere as variveis:
a = [2 4 5 1 3]; i = 2;

Ento tem-se:
a(i+2) a(a(4))

Devolve 1 porque acessa o quarto elemento (i+2 igual a 4) do vetor a.

ndices com valor zero ou negativo no so vlidos no Scilab.

Devolve 2. Como valor de a(4)


1, avaliar a(a(4)) o mesmo avaliar a(1). Logo, a(a(4)) igual a a(1) que, por sua vez, igual a 2. Devolve 4, porque a(a(3)) igual a(5) que, por sua vez, igual a 3. E a(2*i) igual a(4), que igual a 1. Logo, a(a(3))+a(2*i) igual a 3 + 1 = 4.

a(a(3))+a(2*i)

Exerccio resolvido 4.1.1. Figura 4.1.


1 2 3 4 5 6

Calcular a mdia dos elementos do vetor nota dado na

nota = [8.1 5.2 9.2 7.2 6.5 5.2 8.5 9.5 6.5 10.0]; soma = 0; for i=1:10 soma = soma + nota(i); end printf("Mdia das notas = %g\n",soma/10);

Comentrio. Para somar os elementos do vetor, cada elemento foi acessado individualmente e adicionado, um por vez, em um acumulador soma, atravs do lao for...end (linhas 3 a 5). Exerccio resolvido 4.1.2. Ler dois vetores A e B de 10 elementos. Construir um vetor C tal que cada elemento de C seja o dobro da soma entre os elementos correspondentes de A com B. Escrever o vetor C.
1 2 3 4 5 6 7 for i=1:10 a(i) = input("Digite um valor"); end for i=1:10 b(i) = input("Digite um valor"); end for i=1:10 // Leitura de A e B

4.1 Matrizes Unidimensionais / UFRN-DCA - 26 de Abril de 2004

39

8 9 10 11 12

c(i) = 2*(a(i)+b(i)); end for i=1:10 printf("%g ",c(i)); end

// Calculo de C // Escreve de C

Comentrio. O lao for...end, das linhas 1 a 3, faz a leitura de um elemento do vetor a de cada vez. A leitura controlado pelo ndice que faz com que cada leitura seja armazenado em um elemento diferente do vetor a. No lao for...end das linhas 7 a 9, o clculo de cada elemento do vetor c controlado pelo ndice que faz com que seja somando os elementos correspondentes de a e b. Exerccio resolvido 4.1.3. Ler dois vetores A e B de 10 elementos. Construir um vetor C tal que o elemento de ndice mpar de C seja igual ao elemento correspondente de A, caso contrrio, seja igual ao elemento correspondente de B. Por exemplo, c[1]==a[1], c[3]==a[3], . . .. Mas, c[2]==b[2], b[4]==a[4], . . .. Escrever o vetor C.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 for i=1:10 // Leitura de A e B a(i) = input("Digite um valor"); end for i=1:10 b(i) = input("Digite um valor"); end for i=1:10 if modulo(i,2)<>0 // Testa se o ndice i mpar. c(i) = a(i); // Se for mpar c(i) recebe o valor de a(i) else c(i) = b(i); // Se for par c(i) recebe o valor de b(i) end end for i=1:10 // Escreve o vetor C printf("%g ",c(i)); end

Comentrio. A funo modulo (resto de uma diviso) verica se o ndice do vetor C impar ou par porque se resto da diviso entre um nmero qualquer e dois diferente de zero ento ele mpar (no divisvel por dois).

4.1.2

Vetores de String

Podemos construir vetores de strings. Por exemplo:


-->mes = ["jan" "fev" "mar" "abr" "jun" "jul" "ago" "set" "nov" "dez"];

O vetor mes foi construdo de tal modo que h uma correspondncia entre o nmero do ms e o ndice do elemento. Por exemplo, o ms de nmero 11 (novembro) acessado pelo elemento mes(11). Este fato usado para resolver o exerccio a seguir. Exerccio resolvido 4.1.4. Elaborar um programa que leia o dia, o nmero de ms e o ano e escreva a dada no formato D de MMM de AAAA(ou D de MMM de AA). Por exemplo, se o dia 31, o ms 12 e o ano 2003, ento o programa dever escrever 1 de dez de 2003.

4.1 Matrizes Unidimensionais / UFRN-DCA - 26 de Abril de 2004

40

Soluo:
1 2 3 4 5 mes = ["jan" "fev" "mar" "abr" "jun" "jul" "ago" "set" "nov" "dez"]; dia = input("Digite o dia"); nunmes = input("Digite o numero do mes"); ano = input("Digite o ano"); printf("%g de %s de %g\n",dia,mes(nunmes),ano); Resultado Digite o Digite o Digite o 2 de abr dia-->2 numero do mes-->4 ano-->2003 de 2003

Comentrio. Porque a varivel nunmes contm o nmero do ms, o comando printf capaz de escrever o nome do ms atravs do elemento mes(nunmes).

Exerccios
O que este programa escreve?
1 2 3 4 5 6 7 8 poema(1) = uma rosa; poema(2) = ; for a=1:3 for b=1:2 printf("%s ",poema(b)); end end printf(%s,poema(1));

4.1.3

Estudo de Caso

Esta seo ilustra a facilidade que as matrizes oferecem a programao de computadores. Primeiramente, ser mostrado a soluo de um problema sem o uso de vetores visando apontar as diculdades deste procedimento. Em seguida, o mesmo problema ser resolvido com o uso de vetores. Considere o problema: Suponha uma turma com quatro alunos. Elaborar um programa que leia as quatro notas dos alunos e seus respectivos nomes e escreva apenas os nomes com a nota acima da mdia. Neste sentido, uma possvel soluo (sem vetores) seria a seguinte:1
1

Comumente o clculo da mdia das notas pode ser efetuado pelo seguinte trecho de programa: soma = 0; for i = 1:4 nota = input("Digite a nota"); soma = soma + nota; end media = soma/4;

Esta abordagem no resolve o problema proposto porque precisamos comparar se cada nota digitada maior que a mdia. Mas vale notar que as notas j foram perdidas no momento que calculado a mdia na ltima linha (exceto a ltima nota que no foi perdida porque est armazenada na varivel nota). Deste modo, no podemos comparar as mdia com as notas (que foram perdidas). Portanto, a m de evitar a perda das notas, necessrio armazenar cada nota digitada em uma varivel diferente.

4.1 Matrizes Unidimensionais / UFRN-DCA - 26 de Abril de 2004

41

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

aluno1 = input("Nome do aluno","s"); nota1 = input("Nota"); aluno2 = input("Nome do aluno","s"); nota2 = input("Nota"); aluno3 = input("Nome do aluno","s"); nota3 = input("Nota"); aluno4 = input("Nome do aluno","s"); nota4 = input("Nota"); media = (nota1+nota2+nota3+nota4)/4; if nota1 >= media printf("%s\n",aluno1); end if nota2 >= media printf("%s\n",aluno2); end if nota3 >= media printf("%s\n",aluno3); end if nota4 >= media printf("%s\n",aluno4); end

Suponha que, ao invs de uma turma com quatro alunos, houvessem uma turma com cinco alunos, ento teramos: Suponha uma turma com cinco alunos. Elaborar um programa que leia as cinco notas dos alunos e seus respectivos nomes e escreva apenas os nomes com a nota acima da mdia. A soluo deste problema seria similar ao programa anterior, apenas acrescentando algumas linhas (e.g., para ler a quinta nota). A soluo seria:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 aluno1 = input("Nome do aluno","s"); nota1 = input("Nota"); aluno2 = input("Nome do aluno","s"); nota2 = input("Nota"); aluno3 = input("Nome do aluno","s"); nota3 = input("Nota"); aluno4 = input("Nome do aluno","s"); nota4 = input("Nota"); aluno5 = input("Nome do aluno","s"); nota5 = input("Nota"); media = (nota1+nota2+nota3+nota4+nota5)/5; printf("Relao de alunos acima da mdia\n"); if nota1 >= media printf("%s\n",aluno1); end if nota2 >= media printf("%s\n",aluno2); end if nota3 >= media printf("%s\n",aluno3);

4.1 Matrizes Unidimensionais / UFRN-DCA - 26 de Abril de 2004

42

21 22 23 24 25 26 27

end if nota4 >= media printf("%s\n",aluno4); end if nota5 >= media printf("%s\n",aluno5); end

Novamente, suponha que, ao invs de uma turma com cinco alunos, houvessem uma turma com dez alunos. Neste caso, um programa, para ler 10 notas, iria crescer bastante em tamanho (em relao programa anterior) porque seria preciso ler 10 variveis para as notas (i.e., nota1, nota2, . . ., nota10) e 10 para os nomes de alunos, totalizando 20 variveis. Do mesmo modo, para uma turma com 20 alunos, seria preciso ler 40 variveis, sendo as 20 notas e os 20 nomes dos alunos. Considere a situao que fosse preciso ler as notas de todas as turmas de um colgio com 10000 alunos. Ou seja, Suponha uma colgio com 10000 alunos. Elaborar um programa que leia as 10000 notas dos alunos e seus respectivos nomes e escreva apenas os nomes com a nota acima da mdia. Este programa assume proporo gigantesca porque preciso ler 20000 variveis (10000 para as notas e 10000 para os nomes de aluno) tornando-o impraticvel de ser programado (do modo como foi feito antes). Note que as variveis, nota1, nota2, nota3, . . . podem ser substitudas por os elementos de um vetor, por exemplo, nota(1), nota(2), nota(3), . . .. Neste caso, cada elemento do vetor nota seria lida, uma de cada vez, por um lao for...end atravs dos seus ndices. Vejamos a soluo usando vetores.
1 2 3 4 5 6 7 8 9 10 11 12 soma = 0; // acumulador das notas for i = 1:10000 aluno(i) = input("Digite o nome do aluno","s"); nota(i) = input("Nota"); soma = soma + nota(i); end media = soma/10000; // calculo da media for i = 1:10000 if nota(i) >= media printf("%s\n",aluno(i)); end end

Comentrio. No lao for...end das linhas 3 a 6, as notas e os nomes de aluno so lido um de cada vez. O acumulador soma, dentro do lao, soma todas as notas (uma por vez). Os nomes dos alunos com nota acima da mdia so escritos no segundo lao for...end nas linha 8 a 12. Cada nota comparada, uma de cada vez, com a mdia e caso a nota de ndice i passe no teste, o correspondente nome do aluno de ndice i escrito.

4.2 Ordenao de Vetores / UFRN-DCA - 26 de Abril de 2004

43

A concluso que o uso de vetores permite ler e armazenar grande quantidade de notas (e nomes) em um simples lao for...end reduzindo, deste modo, o tamanho de um programa cuja elaborao sem o uso de vetores se torna impraticvel.

4.1.4

Como Obter o Tamanho de um Vetor

A funo length() retorna o tamanho de um vetor. Por exemplo,


-->a = [1 3 3 4 8] a = ! 1. 3. 3. 4. 8. !

-->length(a) ans = 5.

4.2

Ordenao de Vetores

A ordenao de elementos de um conjunto fundamental no dia a dia. Um exemplo bem comum so as listas telefnicas cuja ordenao em ordem alfabtica possibilita rapidamente encontrar um nmero de telefone. Um outro exemplo a ordenao de livros por autor ou por assunto em uma grande biblioteca. Por isso a ordenao uma atividade constantemente solicitada em programao. Provavelmente, o algoritmo de ordenao mais conhecido da computao chama-se o algoritmo da bolha. A idia do algoritmo da bolha passar por todo o vetor comparando cada elemento com o elemento seguinte (i.e., a(i) com a(i+1)) e troca-los caso estes dois elementos no estejam na ordem apropriada. Por diversas vezes, o algoritmo repete a passada at o vetor car completamente ordenado. Vejamos como funciona este algoritmo para ordenar o a = [5 4 3 2 6]. A) Vetor inicial desordenado: a = [5 4 3 2 6] Passo A.1 Comparar a(1) e a(2). Se a(1) > a(2), troque os dois elementos. a = [4 5 3 2 6] Houve troca do nmero 4 com o nmero 5. Passo A.2 Comparar a(2) e a(3). Se a(2) > a(3), troque os dois elementos. a = [4 3 5 2 6] Houve troca do nmero 5 com o nmero 3. Passo A.3 Comparar a(3) e a(4). Se a(3) > a(4), troque os dois elementos. a = [4 3 2 5 6] Houve troca. Passo A.4 Comparar a(4) e a(5). Se a(4) > a(5), troque os dois elementos. a = [4 3 2 5 6] No houve troca porque a(4) no maior que a(5). B) Repetio a iterao (porque o vetor ainda no est ordenado):

4.2 Ordenao de Vetores / UFRN-DCA - 26 de Abril de 2004

44

Passo B.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos. a = [3 4 2 5 6] Houve troca do nmero 4 com o nmero 3. Passo B.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos. a = [3 2 4 5 6] Houve troca do nmero 4 com o nmero 2. Passo B.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos. a = [3 2 4 5 6] No houve troca. Passo B.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os dois elementos. a = [3 2 4 5 6] Novamente no houve troca. C) Repetio a iterao (porque o vetor no est ordenado) Passo C.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos. a = [2 3 4 5 6] Houve troca do nmero 3 com o nmero 2. Passo C.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos. a = [2 3 4 5 6] No houve troca. Passo C.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos. a = [2 3 4 5 6] No houve troca. Passo C.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os dois elementos. a = [2 3 4 5 6] No houve troca. D) Repetio a iterao. (a) Passo D.1 Comparar a[1] e a[2]. Se a[1] > a[2], troque os dois elementos. a = [2 3 4 5 6] No houve troca. (b) Passo D.2 Comparar a[2] e a[3]. Se a[2] > a[3], troque os dois elementos. a = [2 3 4 5 6] No houve troca. (c) Passo D.3 Comparar a[3] e a[4]. Se a[3] > a[4], troque os dois elementos. a = [2 3 4 5 6] No houve troca. (d) Passo D.4 Comparar a[4] e a[5]. Se a[4] > a[5], troque os elementos. a = [2 3 4 5 6] No houve troca.

4.3 Matrizes Bidimensionais / UFRN-DCA - 26 de Abril de 2004

45

E) Se no houve troca na ltima iterao ento pare porque o vetor j est ordenado. O seguinte trecho de programa implementa o algoritmo da bolha para ordenar a vetor a (supondo que o vetor a j foi lido e est na memria).
1 2 3 4 5 6 7 8 9 10 11 12 13 n = length(a); HouveTroca = %t; while HouveTroca HouveTroca = %f; for i = 1:(n-1) if a(i) > a(i+1) temp = a(i); a(i) = a(i+1); a(i+1) = temp; HouveTroca = %t; end end end // Obtem o tamanho do vetor

// troca o elemento i com i+1

// Houve troca

Comentrio. A varivel booleana HouveTroca indica se houve troca ou no aps a ltima passada pelo vetor. A varivel HouveTroca assume o valor falso na linha 4, e se dentro do lao interno for...end no houver troca ento a varivel HouveTroca continuar com valor falso (isto far com que o lao while...end encerre a execuo do programa). Caso contrrio, a varivel HouveTroca assume o valor verdadeiro na linha 10) (isto far com que o lao while...end execute nova iterao). A troca de um elemento com o elemento seguinte (i.e., a(i) com a(i+1)) realizado pelo trecho:
temp = a(i); a(i) = a(i+1); a(i+1) = temp;

A varivel temp uma varivel temporria usada apenas para guardar o valor de a(i) antes que o mesmo seja perdido na atribuio a(i) = a(i+1). Exerccio 4.2.1. Modique trecho de programa que contm algoritmo da bolha para colocar o vetor em ordem decrescente (troque o operador > por < na linha 6). Use esta modicao para elaborar um programa para ler um vetor com 5 elementos, coloca-lo em ordem decrescente e escreve-lo.

4.3

Matrizes Bidimensionais

Matrizes bidimensionais necessitam de dois ndices para individualizar os elementos. Na Figura 4.3 mostrada uma matriz. Matrizes so construdas envolvendo seus elementos em colchetes. Cada linha da matriz separada por um ponto e vrgula e cada elemento de uma linha separado por um espao (ou vrgula). Por exemplo, a seguinte matriz da matemtica, 2 3 4 A= 4 5 2 poderia ser construda no Scilab pelo comando:

4.3 Matrizes Bidimensionais / UFRN-DCA - 26 de Abril de 2004

46

Figura 4.2: Matriz bidimensional


-->a = [2 3 4; 4 5 2] a = ! ! 2. 4. 3. 5. 4. ! 2. !

Os elementos da matriz a so acessados usando dois ndices. Por exemplo,


-->a(1,2) ans = 3. -->a(2,3) ans = 2. -->a(1,3) ans = 4.

Exerccio resolvido 4.3.1. Dado a matriz A:


A=

3 1 2 4 5 5 8 6 8 10 11 5 9 1 5 7 2 3 8 8

Pede-se: a) Colocar a matriz A na memria do computador.


a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8];

b) Preencher a terceira coluna da matriz A com o valor zero.

4.3 Matrizes Bidimensionais / UFRN-DCA - 26 de Abril de 2004

47

a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 a(i,3) = 0 end

c) Calcular a soma dos elementos da diagonal principal da matriz A e escrever o resultado.


a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; soma = 0; for i=1:4 soma = soma + a(i,i); end printf("soma = %g\n",soma);

d) Calcular a soma dos quadrados dos elementos da segunda linha de A e escrever o resultado.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; soma = 0; for i=1:4 soma = soma + a(2,i)^2; end printf("soma = %g\n",soma);

e) Somar de todos os elementos de A.


a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; soma = 0; for i=1:5 for j=1:4 soma = soma + a(i,j); end end

f) Armazenar a soma de cada linha de A no vetor S (ver Figura 4.3)


a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 soma = 0; for j=1:4 soma = soma + a(i,j); end s(i) = soma; end

g) Trocar a segunda linha com quarta linha.


a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for j=1:4 aux = a(2,j) a(2,j) = a(4,i); a(4,j) = aux; end

4.3 Matrizes Bidimensionais / UFRN-DCA - 26 de Abril de 2004

48

h) Escrever a matriz A.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 for j=1:4 printf("%3.0f ",a(i,j)); end printf("\n"); end

i) Ler uma matriz B de mesma dimenso que A. Efetuar a soma matricial A + B e armazenar o resultado na matriz C.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 for j=1:4 b(i,j) = input("Digite um nmero"); end end for i=1:5 for j=1:4 c(i,j) = a(i,j) + b(i,j); end end

j) Ler uma matriz B de mesma dimenso que A. Escrever IGUAIS se A for uma matriz igual B. Caso contrrio, escrever DIFERENTES.
a = [3 1 2 4; 5 5 8 6; 8 10 11 5; 9 1 5 7; 2 3 8 8]; for i=1:5 for j=1:4 b(i,j) = input("Digite um nmero"); end end iguais = %t; for i=1:5 for j=1:4 if a(i,j) <> b(i,j) iguais = %f; end end end if iguais printf("Iguais\n"); else printf("Diferentes\n"); end

Exerccio 4.3.2. Elabore um programa para ler a matriz A, trocar a segunda linha com terceira linha e escrever a matriz A.

4.3 Matrizes Bidimensionais / UFRN-DCA - 26 de Abril de 2004

49

Figura 4.3: Soma das linhas da matriz A.

4.3.1

Como Obter as Dimenses de uma Matriz

A funo size() retorna um vetor com as duas dimenses de uma matriz. Por exemplo, considere a matriz:
-->a = [1 2 3 4 5; 3 4 5 6 5] a = ! ! 1. 3. 2. 4. 3. 5. 4. 6. 5. ! 5. !

A funo size() retorna um vetor de dois elementos com nmero de linhas e colunas da matriz. Por exemplo:
-->size(a) ans = ! 2. 5. !

Outro exemplo:
-->[l c] = size(a) c = 5. = 2.

A funo size(x,1) (ou size(x,"r")) retorna somente nmero de linhas da matriz. Por exemplo,
size(a,1) size(a,"r") // retorna 2 // retorna 2

A funo size(x,2) (ou size(x,"c")) retorne somente nmero de colunas da matriz. Por exemplo,
size(a,2) // retorna 5

Considere o vetor:
b = [3 1 2 4] // O Scilab considera b tanto // um vetor com 4 elementos como // tambm uma matriz 1x4. // retorna 4

size(b,"c")

4.4 Exemplos com Matrizes / UFRN-DCA - 26 de Abril de 2004

50

4.4

Exemplos com Matrizes

Gerando Nmeros Aleatrios


Exerccio resolvido 4.4.1. Elabore um programa que, simulando lanamentos de dados, calcule a freqncia de cada resultado aps 100 lanamentos. Para resolver este problema utiliza-se a funo rand (tambm chamada de gerador de nmeros aleatrios). Esta funo retorna um nmero diferente (aleatrio) cada vez que chamada, por exemplo:
-->rand() ans = .4410204 -->rand() ans = .8859080 -->rand() ans = .6868068

Os nmeros aleatrios gerados por rand so nmeros fracionrios no intervalo [0, 1]. No entanto, o problema pede para gerar nmeros inteiros aleatoriamente entre 1 e 6 de modo a simular o lanamento de um dado. Isto pode ser obtido com o seguinte procedimento. Primeiro, multiplica-se rand por 6 para gerar nmeros no intervalo [0, 6]. Por exemplo:
-->6*rand()

Em seguida, usa-se a funo fix() para gerar apenas nmeros inteiros entre 0 e 5 (inclusive). Por exemplo,
-->fix(6*rand())

Por m, adiciona-se o valor 1 na expresso anterior para gerar nmeros inteiros entre 1 e 6.
-->fix(6*rand())+1)

e obtm-se, deste modo, nmeros inteiros aleatrios entre 1 e 6 na qual simula o lanamento de um dado como requerido. Ser utilizado, tambm, um vetor f que armazena a freqncia de cada dado. Por exemplo, o elemento f(1) armazena a freqncia do dado 1, o elemento f(2) armazena a freqncia do dado 2, e assim por diante. Soluo:
1 2 3 4 for i = 1:6 f(i) = 0; end for i=1:100

// inicializa o vetor de frequencias

4.4 Exemplos com Matrizes / UFRN-DCA - 26 de Abril de 2004

51

5 6 7 8 9 10 11

r = fix(6*rand())+1; f(r) = f(r)+1; end for i=1:6 f(i) = f(i)/100; printf("freqncia do end

// lanamento do dado // adiciona 1 ao dado r

// divide o vetor f por 100 para obter a frequencia. dado %1.0f = %5.2f\%\n",i,f(i));

Uma possvel execuo do programa seria:


Resultado freqncia freqncia freqncia freqncia freqncia freqncia do do do do do do dado dado dado dado dado dado 1 2 3 4 5 6 = = = = = = 0.12% 0.13% 0.29% 0.22% 0.13% 0.11%

Uma Aplicao de Matrizes


Exerccio resolvido 4.4.2. Alguns candidatos prestaram concurso para cinco vagas em uma empresa. Os resultados das provas do concurso esto armazenadas nas seguintes matrizes: Nome Ana Carlos Francisco Jos Magali Marcos Maria Marta Paulo Pedro Escreva um programa que: a) Armazene o nomes dos candidados em um vetor nome e as notas das provas em uma matriz nota 10 3. O smbolo ... ser usado para continuar os comandos na linha seguinte.
nome = ["Ana" "Carlos" "Francisco" ... "Jos" "Magali" "Marcos" ... "Maria" "Marta" "Paulo" "Pedro"]; nota = [6.5 8.0 7.5 6.1 7.1 8.3 8.1 5.2 7.5; 7.2; 8.3; 6.0; ... ... ... ...

Matemtica 6,5 8,0 7,5 6,1 5,1 4,1 9,1 8,8 9,5 8,2

Portugus 7,1 8,3 8,1 5,2 6,1 5,5 8,9 8,5 9,3 8,5

Digitao 7,5 7,2 8,3 6,0 6,5 5,4 9,4 9,0 9,1 7,8

4.4 Exemplos com Matrizes / UFRN-DCA - 26 de Abril de 2004

52

5.1 4.1 9.1 8.8 9.5 8.2

6.1 5.5 8.9 8.5 9.3 8.5

6.5; ... 5.4; ... 9.4; ... 9.0; ... 9.1; ... 7.8];

b) Calcule a mdia de cada candidato, armazene em um vetor media e escreva-o. Neste programa e nos seguintes assumido que o cdigo acima j est includo no programa.
1 2 3 4 5 6 7 8 9 10 11 12 [m,n]=size(nota); for i=1:m soma = 0; for j=1:n soma = soma+nota(i,j); end media(i)=soma/3; end printf("Nome Media\n"); // linha de cabeario for i=1:m printf("%-10s %3.1f\n",nome(i),media(i)); end Resultado Nome Ana Carlos Francisco Jos Magali Marcos Maria Marta Paulo Pedro Media 7.0 7.8 8.0 5.8 5.9 5.0 9.1 8.8 9.3 8.2

c) Calcule e escreva a maior nota da prova de portugus e a nome do respectivo candidato.


1 2 3 4 5 6 7 8 9 maior = 0.0; m = size(nota,1); for i=1:m if nota(i,2) > maior maior = nota(i,2); imaior = i; // Armazena o ndice da maior nota. end end printf("A maior nota de portugus: %s, %3.1f\n",nome(imaior),maior);

d) Elabore um programa para escrever um relatrio dos candidatos em ordem de classicao dos candidados.

4.4 Exemplos com Matrizes / UFRN-DCA - 26 de Abril de 2004

53

O soluo desta questo mostrado no programa listado abaixo. Na primeira parte do programa (linhas 1-8), calcula-se a mdia da mesma maneira que no item(b) deste exerccio. Na segunda parte do programa (linhas 10-25) feita a ordenao dos vetores com o algoritmo da bolha. O vetor ordenado o vetor media, mas note que para cada dois elementos trocados do vetor do media tambm trocado os respectivos elementos do vetor nome para acompanhar a mesma ordem do vetor media. Na ltima parte do programa (linha 27-30) impresso o relatrio dos candidatos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [m,n]=size(nota); for i=1:m // Computa as medias dos alunos soma = 0; for j=1:n soma = soma+nota(i,j); end media(i)=soma/3; end // ordenao e troca dos elementos HouveTroca = %t; while HouveTroca HouveTroca = %f; for i = 1:(m-1) if media(i) < media(i+1) temp = media(i); // troca o elemento media i com i+1 media(i) = media(i+1); media(i+1) = temp; temp = nome(i); // troca o elemento nome2 i com i+1 nome(i) = nome(i+1); nome(i+1) = temp; HouveTroca = %t; // Houve troca end end end printf(" Nome Media\n"); // linha de cabeario for i=1:m printf("%2.0f- %-10s %3.1f\n",i,nome2(i),media(i)); end Resultado 12345678910Nome Paulo Maria Marta Pedro Francisco Carlos Ana Magali Jos Marcos Media 9.3 9.1 8.8 8.2 8.0 7.8 7.0 5.9 5.8 5.0