Diferenças entre edições de "Manipulação de vetores"

De GNU Octave
Ir para: navegação, pesquisa
(Indexar vetor)
 
(Há 24 revisões intermédias de 3 utilizadores que não estão a ser apresentadas)
Linha 1: Linha 1:
 
Existem muitas formas de manipular vetores no Octave.
 
Existem muitas formas de manipular vetores no Octave.
  
=== Constantes ===
+
=== Definição de um vetor ===
  
 
A forma mais simples de definir um vetor em Octave é listando os valores do mesmo entre '[' e ']'. Pode separar cada um dos elementos com vírgulas ou com espaços.
 
A forma mais simples de definir um vetor em Octave é listando os valores do mesmo entre '[' e ']'. Pode separar cada um dos elementos com vírgulas ou com espaços.
  
 
<syntaxhighlight>
 
<syntaxhighlight>
octave:1> vel = [ 50 50 70 90 120 ]
+
>> vel = [ 50 50 70 90 120 ]
 
vel =
 
vel =
 
     50    50    70    90  120
 
     50    50    70    90  120
octave:2> peso = [ 82.4, 82.7, 82.5]
+
>> peso = [ 82.4, 82.7, 82.5]
 
peso =
 
peso =
 
   82.400  82.700  82.500
 
   82.400  82.700  82.500
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Operações ===
+
===== Notação (formato dos números apresentados) =====
  
Se aplicar um operador normal, como a multiplicação, a um argumento do tipo vetor, o mesmo é aplicado a todos os elementos do vetor.
+
Lembre-se que os números podem ser apresentados de forma ligeiramente diferente, usando comandos como:
  
 
<syntaxhighlight>
 
<syntaxhighlight>
octave:13> val = [1 2 3 4 5]
+
>> format long
val =
+
>> format long g
  1  2  3  4  5
+
>> format short
octave:14> val*2
+
>> format free
ans =
+
    2    4    6    8  10
+
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Da mesma forma, pode aplicar uma função a todos os elementos de um vetor.
+
pode alterar a forma de apresentação dos números. Para experimentar os comandos anteriores, deverá indicar o formato e depois mostrar o vetor.
 +
 
 +
Exemplo:
  
 
<syntaxhighlight>
 
<syntaxhighlight>
octave:15> valores = [0 pi/2 pi]
+
>> format long g
valores =
+
>> peso = [82.4, 82.7, 82.5]
  0.00000  1.57080  3.14159
+
peso =
octave:16> sin(valores)
+
          82.4      82.7      82.5
ans =
+
>>
  0.00000  1.00000  0.00000
+
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Operadores unários
+
Outro exemplo:
  
 
<syntaxhighlight>
 
<syntaxhighlight>
octave:32> x = 4:8
+
>> format free
x =
+
>> peso
  4   5  6  7   8
+
peso =
octave:33> x^2
+
82.4 82.7 82.5
error: for A^b, A must be square
+
>>
octave:33> x.^2
+
</syntaxhighlight>
ans =
+
  
  16  25  36  49  64
+
Para saber mais sobre os formatos possíveis, faça:
 +
 
 +
<syntaxhighlight>
 +
>> help format
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Geração de vetores ===
+
=== Definição de um vetor por compreensão ===
  
Existe um operador específico para gerar vetores utilizando um valor inicial, um incremento e um limite. O operador usa-se da seguinte forma:
+
Pode-se definir um vetor sem ter que enumerar todos os seus elementos. Uma forma muito simpática de o fazer é através da indicação do  valor inicial, um incremento e o limite. O operador usa-se da seguinte forma:
  
 
''valor inicial: incremento: limite''
 
''valor inicial: incremento: limite''
 +
 +
No caso seguinte usa-se:
 +
 +
valor inicial = 0
 +
 +
incremento = 5
 +
 +
limite = 20
  
 
<syntaxhighlight>
 
<syntaxhighlight>
octave:30> 1:1/3:3
+
>> 0:5:20
 
ans =
 
ans =
     1.0000   1.3333    1.6667    2.0000    2.3333    2.6667    3.0000
+
     0   5  10  15  20
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Desta forma é muito fácil, por exemplo, calcular os valores da função y = 2 * x - 3 para os valores de 1 a 10.
+
Desta forma é muito fácil, por exemplo, definir um vetor com os valores de 1 a 10.  
  
 
<syntaxhighlight>
 
<syntaxhighlight>
octave:34> x = 1:1:10
+
>> x = 1:1:10
 
x =
 
x =
 
     1    2    3    4    5    6    7    8    9  10
 
     1    2    3    4    5    6    7    8    9  10
octave:35> y = 2*x-3
 
y =
 
  -1    1    3    5    7    9  11  13  15  17
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Linha 78: Linha 84:
  
 
<syntaxhighlight>
 
<syntaxhighlight>
octave:1> 15:20
+
>> 15:20
 
ans =
 
ans =
  
Linha 84: Linha 90:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Teste ===
+
Alternativamente, pode-se usar a função <code>linspace</code> para gerar um vetor com N elementos, igualmente espaçados entre o valor inicial e final, usando a sintaxe:
  
{| class="collapsible collapsed wikitable"
+
<syntaxhighlight>
|-
+
linspace(inicial,final,N)
! This is the header cell, which is always shown
+
</syntaxhighlight>
|-
+
| This cell is not shown by default.
+
|}
+
  
=== Exercícios ===
+
Para obter um vetor com 6 elementos, igualmente espaçados entre 1 e 10, escreve-se <syntaxhighlight enclose="none">linspace(1,10,6)</syntaxhighlight>. Para criar um vetor com 4 elementos, igualmente espaçados entre 0 e 60, escreve-se <syntaxhighlight enclose="none">linspace(0,60,4)</syntaxhighlight>.
  
# Crie um vetor com todos os múltiplos de 3, entre 1 e 100.
+
<syntaxhighlight>
{| class="collapsible collapsed wikitable"
+
>> linspace(1,10,6)
|-
+
ans =
! Resposta
+
|-
+
| <syntaxhighlight>3:3:100</syntaxhighlight>
+
|}
+
# Seja x = [1 2 3 4 5].
+
## Calcule y = -3x^2 +4x -1, para os valores de x.
+
{| class="collapsible collapsed wikitable"
+
|-
+
! Resposta
+
|-
+
| <syntaxhighlight>y = -3*x.^2 + 4*x -1</syntaxhighlight>
+
|}
+
## Calcule o máximo valor de y.
+
## Calcule o máximo valor de y.
+
# COnsidere os seguintes dados.
+
#* Seja precounitario = [ 2.45, 3.95, 8 ]
+
#* Seja quantidade = [2 6 3]
+
## Calcule o produto dos vetores precounitario e quantidade
+
  
p .* q (produto elemento a elemento; .+ soma lemento a elemento)
+
1 2.8 4.6 6.4 8.2 10
P * q (erro)
+
  
5) Calcule o total resultante do produto anterior
+
>> linspace(0,60,4)
p*q'
+
ans =
dot(p,q)
+
  
===== Mais sobre a gestão de ficheiros no Octave =====
+
0 20 40 60
pwd
+
</syntaxhighlight>
  
Indica qual é a pasta de trabalho atual
+
No segundo exemplo
  
dir
+
=== Feedback ===
  
Mostra o conteúdo da pasta de trabalho atual
+
Quando se define um vetor, o octave apresenta imediatamente o mesmo, como aconteceu nos exercícios anteriores. Caso não se pretenda ter esse feedback, termina-se a instrução com <code>;</code>. No exemplo seguinte define-se um vetor x com e sem <code>;</code> no fim da instrução.
  
cd
+
<syntaxhighlight>
 +
>> x = 1:10
 +
x =
 +
    1    2    3    4    5    6    7    8    9  10
 +
>> x = 1:10;
 +
</syntaxhighlight>
  
Permite mudar para outra pasta
+
=== Indexar vetor ===
  
cd ..
+
Pode-se indicar um índice para aceder a uma parte do vetor.
Muda para a pasta anterior
+
  
cd [[NomeDaPasta]]
+
Estude as seguintes formas de indexar parte de um vetor:
cd 'Nome da Pasta'
+
  
Pode-se usar a tecla <TAB> para expandir o nome da pasta. Por exemplo, para mudar para a pasta Desktop, basta escrever:
+
<syntaxhighlight>
cd Desk<TAB> e aparece-lhe cd Desktop
+
>> peso = [ 82.4, 82.7, 82.5]
 +
peso =
 +
82.4 82.7 82.5
 +
>> peso(1)
 +
ans = 82.4
 +
>> peso(2)
 +
ans = 82.7
 +
>> peso(3)
 +
ans = 82.5
 +
>> peso(2:3)
 +
ans =
 +
82.7 82.5
 +
>> peso(end)
 +
ans = 82.5
 +
</syntaxhighlight>
 +
 
 +
=== Indexar/filtrar vetor ===
 +
 
 +
Na verdade, ao usar um índice para aceder a uma parte do vetor, está-se a filtrar uma parte de um vetor.
 +
 
 +
Estude as seguintes formas de indexar/filtrar parte de um vetor:
 +
 
 +
<syntaxhighlight>
 +
>> meses = [ 31 28 31 30 31 30 31 31 30 31 30 31]
 +
>> meses(1:end/2)
 +
>> meses(7:end)
 +
>> meses(meses == 31)
 +
>> meses(meses != 31)
 +
>> length(meses(meses != 31))
 +
</syntaxhighlight>
 +
 
 +
=== Operações ===
 +
 
 +
Se aplicar um operador normal, como a multiplicação, a um argumento do tipo vetor, o mesmo é aplicado a todos os elementos do vetor.
 +
 
 +
<syntaxhighlight>
 +
>> val = [1 2 3 4 5]
 +
val =
 +
  1  2  3  4  5
 +
>> val*2
 +
ans =
 +
    2    4    6    8  10
 +
</syntaxhighlight>
 +
 
 +
Da mesma forma, pode aplicar uma função a todos os elementos de um vetor.
 +
 
 +
<syntaxhighlight>
 +
>> valores = [0 pi/2 pi]
 +
valores =
 +
  0.00000  1.57080  3.14159
 +
>> sin(valores)
 +
ans =
 +
  0.00000  1.00000  0.00000
 +
</syntaxhighlight>
 +
 
 +
Operadores sobre os elementos dos vectores
 +
 
 +
<syntaxhighlight>
 +
>> x = [4 5 6 7 8]
 +
x =
 +
  4  5  6  7  8
 +
>> x^2
 +
error: for A^b, A must be square
 +
>> x.^2
 +
ans =
 +
 
 +
  16  25  36  49  64
 +
</syntaxhighlight>
 +
 
 +
=== Exercícios ===
 +
 
 +
# Crie um vetor com todos os múltiplos de 3, entre 1 e 100.
 +
# Seja x = [1 2 3 4 5].
 +
## Calcule os valores da função y = -3x^2 +4x -1, para os valores de x.
 +
## Calcule o máximo valor de y (no domínio definido por x).
 +
# Considere os seguintes dados. Tem 3 artigos diferentes, cada um com o seu preço unitário, e quer adquirir determinadas quantidades de cada um desses artigos.
 +
#* Seja preco = [ 2.45, 3.95, 8]
 +
#* Seja quantidade = [2 6 3]
 +
## Calcule o preço a pagar por cada um dos artigos, atendendo à quantidade.
 +
## Calcule valor total, isto é o valor a pagar por todos os artigos multiplicados pelas respectivas quantidades.
 +
# Crie um vetor com todos os múltiplos de 5 ou 7 entre 100 e 200
 +
 
 +
{| class="collapsible collapsed wikitable"
 +
|-
 +
! Soluções dos exercícios
 +
! Resumo
 +
! Resposta
 +
|-
 +
| 1
 +
| Múltiplos de 3
 +
| <syntaxhighlight>3:3:100</syntaxhighlight>
 +
|-
 +
| 2
 +
| Dados do problema
 +
| <syntaxhighlight>x = [1 2 3 4 5]</syntaxhighlight>
 +
|-
 +
| 2.1
 +
| Calcular os valores da função y
 +
| <syntaxhighlight>y = -3*x.^2 + 4*x -1
 +
y =
 +
    0  -5  -16  -33  -56
 +
</syntaxhighlight>
 +
|-
 +
| 2.2
 +
| Máximo de y
 +
| <syntaxhighlight>max(y)
 +
ans = 0
 +
</syntaxhighlight>
 +
|-
 +
| 3
 +
| Dados do problema
 +
| <syntaxhighlight>preco = [ 2.45, 3.95, 8 ]
 +
quantidade = [2 6 3]
 +
</syntaxhighlight>
 +
|-
 +
| 3.1
 +
| Valor a pagar por cada artigo (preço x quantidade)
 +
| <syntaxhighlight>preco .* quantidade
 +
ans =
 +
    4.9000  23.7000  24.0000
 +
</syntaxhighlight>
 +
|-
 +
|rowspan="3"|3.2
 +
| Valor total a pagar
 +
| <syntaxhighlight>sum(preco .* quantidade)
 +
ans =  52.600
 +
</syntaxhighlight>
 +
|-
 +
| Valor total a pagar
 +
| <syntaxhighlight>preco * quantidade'
 +
ans =  52.600
 +
</syntaxhighlight>
 +
|-
 +
| Valor total a pagar
 +
| <syntaxhighlight>dot(preco,quantidade)
 +
ans =  52.600
 +
</syntaxhighlight>
 +
|-
 +
| 4
 +
| Múltiplos de 5 ou 7 entre 100 e 200
 +
| <syntaxhighlight>num = 100:200;
 +
mult = num(or(mod(num, 5) == 0, mod(num, 7) == 0))
 +
</syntaxhighlight>
 +
|-
 +
|
 +
| Outra forma de resolver
 +
| <syntaxhighlight>mul5 = 100:5:200;
 +
mul7 = 105:7:200;
 +
unique(sort(horzcat(mul5, mul7)))
 +
</syntaxhighlight>
 +
|}
  
 
=== Grandes vetores ===
 
=== Grandes vetores ===
No Octave pode-se guardar uma ou mais variáveis num arquivo para posterior utilização. No arquivo heartrate.m, disponível em http://octave.di.uminho.pt/images/files/ tem a definição de um vetor chamado bpm.
+
No Octave pode-se guardar uma ou mais variáveis num documento para posterior utilização. No documento <code>heartrate.m</code>, disponível em http://octave.di.uminho.pt/images/files/ tem a definição de um vetor chamado <code>bpm</code>.
Descarregue o arquivo, e depois leia o vetor bpm do arquivo heartrate.m, com o comando:
+
Descarregue o documento, e depois leia o vetor <code>bpm</code> do documento <code>heartrate.m</code>.
'''
+
 
octave:1> load heartrate.m bpm
+
<syntaxhighlight>
 +
>> load heartrate.m bpm
  
octave:1> load "C:/Users/jgr/Downloads/heartrate.m"
+
>> load "C:/Users/jgr/Downloads/heartrate.m"
octave:2> who
+
>> who
 
Variables in the current scope:
 
Variables in the current scope:
 
ans  bpm
 
ans  bpm
octave:3> bpm
+
>> bpm
'''
+
</syntaxhighlight>
  
Neste vetor estão registados os batimentos cardíacos (batimentos por minuto) registados com intervalor de 5 segundos. O registo começou às 08:40:19 do dia 2012-10-03.
+
Neste vetor estão registados os batimentos cardíacos (batimentos por minuto) registados com intervalos de 5 segundos. O registo começou às 08:40:19 do dia 2012-10-03.
  
i) Diga quantos valores (comprimento) tem o vetor bpm.
+
i) Diga quantos valores tem o vetor <code>bpm</code>, ou seja, qual o comprimento ou dimensão do vetor <code>bpm</code>.
 +
 
 +
<syntaxhighlight>
 +
length(bpm)
 +
</syntaxhighlight>
  
 
ii) Diga qual o valor mínimo do vetor.
 
ii) Diga qual o valor mínimo do vetor.
 +
 +
<syntaxhighlight>
 +
min(bpm)
 +
</syntaxhighlight>
  
 
ii) Diga qual o valor máximo do vetor.
 
ii) Diga qual o valor máximo do vetor.
 +
 +
<syntaxhighlight>
 +
max(bpm)
 +
</syntaxhighlight>
  
 
iii) Diga quantas vezes se registaram batimentos acima dos 160.
 
iii) Diga quantas vezes se registaram batimentos acima dos 160.
 +
 +
<syntaxhighlight>
 +
fortes = bpm(bpm > 160);
 +
length(fortes)
 +
</syntaxhighlight>
  
 
iv) Diga qual a média dos batimentos cardíacos.
 
iv) Diga qual a média dos batimentos cardíacos.
  
 +
<syntaxhighlight>
 
mean(bpm)
 
mean(bpm)
//ou sum(bpm)/length(bpm)//
+
</syntaxhighlight>
 +
ou
 +
<syntaxhighlight>
 +
sum(bpm)/length(bpm)
 +
</syntaxhighlight>
  
v) Mostre apenas os primeiros 5 elementos do vetor bpm
+
v) Mostre apenas os primeiros 5 elementos do vetor <code>bpm</code>.
 +
 
 +
<syntaxhighlight>
 +
bpm(1:5)
 +
</syntaxhighlight>

Edição atual desde as 16h15min de 17 de outubro de 2017

Existem muitas formas de manipular vetores no Octave.

Definição de um vetor

A forma mais simples de definir um vetor em Octave é listando os valores do mesmo entre '[' e ']'. Pode separar cada um dos elementos com vírgulas ou com espaços.

>> vel = [ 50 50 70 90 120 ]
vel =
    50    50    70    90   120
>> peso = [ 82.4, 82.7, 82.5]
peso =
   82.400   82.700   82.500
Notação (formato dos números apresentados)

Lembre-se que os números podem ser apresentados de forma ligeiramente diferente, usando comandos como:

>> format long
>> format long g
>> format short
>> format free

pode alterar a forma de apresentação dos números. Para experimentar os comandos anteriores, deverá indicar o formato e depois mostrar o vetor.

Exemplo:

>> format long g
>> peso = [82.4, 82.7, 82.5]
peso =
          82.4       82.7       82.5
>>

Outro exemplo:

>> format free
>> peso
peso =
 82.4 82.7 82.5
>>

Para saber mais sobre os formatos possíveis, faça:

>> help format

Definição de um vetor por compreensão

Pode-se definir um vetor sem ter que enumerar todos os seus elementos. Uma forma muito simpática de o fazer é através da indicação do valor inicial, um incremento e o limite. O operador usa-se da seguinte forma:

valor inicial: incremento: limite

No caso seguinte usa-se:

valor inicial = 0

incremento = 5

limite = 20

>> 0:5:20
ans =
    0    5   10   15   20

Desta forma é muito fácil, por exemplo, definir um vetor com os valores de 1 a 10.

>> x = 1:1:10
x =
    1    2    3    4    5    6    7    8    9   10

Pode ser abreviado para valor inicial: limite assumindo-se que o incremento é 1. Pode-se fazer, por exemplo:

>> 15:20
ans =
 
   15   16   17   18   19   20

Alternativamente, pode-se usar a função linspace para gerar um vetor com N elementos, igualmente espaçados entre o valor inicial e final, usando a sintaxe:

linspace(inicial,final,N)

Para obter um vetor com 6 elementos, igualmente espaçados entre 1 e 10, escreve-se linspace(1,10,6). Para criar um vetor com 4 elementos, igualmente espaçados entre 0 e 60, escreve-se linspace(0,60,4).

>> linspace(1,10,6)
ans =
 
 1 2.8 4.6 6.4 8.2 10
 
>> linspace(0,60,4)
ans =
 
 0 20 40 60

No segundo exemplo

Feedback

Quando se define um vetor, o octave apresenta imediatamente o mesmo, como aconteceu nos exercícios anteriores. Caso não se pretenda ter esse feedback, termina-se a instrução com ;. No exemplo seguinte define-se um vetor x com e sem ; no fim da instrução.

>> x = 1:10
x =
    1    2    3    4    5    6    7    8    9   10
>> x = 1:10;

Indexar vetor

Pode-se indicar um índice para aceder a uma parte do vetor.

Estude as seguintes formas de indexar parte de um vetor:

>> peso = [ 82.4, 82.7, 82.5]
peso =
 82.4 82.7 82.5
>> peso(1)
ans = 82.4
>> peso(2)
ans = 82.7
>> peso(3)
ans = 82.5
>> peso(2:3)
ans =
 82.7 82.5
>> peso(end)
ans = 82.5

Indexar/filtrar vetor

Na verdade, ao usar um índice para aceder a uma parte do vetor, está-se a filtrar uma parte de um vetor.

Estude as seguintes formas de indexar/filtrar parte de um vetor:

>> meses = [ 31 28 31 30 31 30 31 31 30 31 30 31]
>> meses(1:end/2)
>> meses(7:end)
>> meses(meses == 31)
>> meses(meses != 31)
>> length(meses(meses != 31))

Operações

Se aplicar um operador normal, como a multiplicação, a um argumento do tipo vetor, o mesmo é aplicado a todos os elementos do vetor.

>> val = [1 2 3 4 5]
val =
   1   2   3   4   5
>> val*2
ans =
    2    4    6    8   10

Da mesma forma, pode aplicar uma função a todos os elementos de um vetor.

>> valores = [0 pi/2 pi]
valores =
   0.00000   1.57080   3.14159
>> sin(valores)
ans =
   0.00000   1.00000   0.00000

Operadores sobre os elementos dos vectores

>> x = [4 5 6 7 8]
x =
   4   5   6   7   8
>> x^2
error: for A^b, A must be square
>> x.^2
ans =
 
   16   25   36   49   64

Exercícios

  1. Crie um vetor com todos os múltiplos de 3, entre 1 e 100.
  2. Seja x = [1 2 3 4 5].
    1. Calcule os valores da função y = -3x^2 +4x -1, para os valores de x.
    2. Calcule o máximo valor de y (no domínio definido por x).
  3. Considere os seguintes dados. Tem 3 artigos diferentes, cada um com o seu preço unitário, e quer adquirir determinadas quantidades de cada um desses artigos.
    • Seja preco = [ 2.45, 3.95, 8]
    • Seja quantidade = [2 6 3]
    1. Calcule o preço a pagar por cada um dos artigos, atendendo à quantidade.
    2. Calcule valor total, isto é o valor a pagar por todos os artigos multiplicados pelas respectivas quantidades.
  4. Crie um vetor com todos os múltiplos de 5 ou 7 entre 100 e 200

Grandes vetores

No Octave pode-se guardar uma ou mais variáveis num documento para posterior utilização. No documento heartrate.m, disponível em http://octave.di.uminho.pt/images/files/ tem a definição de um vetor chamado bpm. Descarregue o documento, e depois leia o vetor bpm do documento heartrate.m.

>> load heartrate.m bpm
 
>> load "C:/Users/jgr/Downloads/heartrate.m"
>> who
Variables in the current scope:
ans  bpm
>> bpm

Neste vetor estão registados os batimentos cardíacos (batimentos por minuto) registados com intervalos de 5 segundos. O registo começou às 08:40:19 do dia 2012-10-03.

i) Diga quantos valores tem o vetor bpm, ou seja, qual o comprimento ou dimensão do vetor bpm.

length(bpm)

ii) Diga qual o valor mínimo do vetor.

min(bpm)

ii) Diga qual o valor máximo do vetor.

max(bpm)

iii) Diga quantas vezes se registaram batimentos acima dos 160.

fortes = bpm(bpm > 160);
length(fortes)

iv) Diga qual a média dos batimentos cardíacos.

mean(bpm)

ou

sum(bpm)/length(bpm)

v) Mostre apenas os primeiros 5 elementos do vetor bpm.

bpm(1:5)