2. Roteiro
Terminal Octave.
Comandos sobre arquivos.
Comandos matemáticos básicos.
Comandos de vetores e matrizes.
Comandos lógicos.
Comandos sobre imagens.
Comandos de conversão de tipos.
Funções.
Scripts.
Erros comuns.
Octave 2/43
3. Instruções
Para aproveitar bem esta aula, siga os slides
executando no terminal do Linux e no terminal
do Octave os exemplos dados.
Octave 3/43
4. Terminal Octave (1)
Para abrir um terminal do octave basta abrir um terminal
do Linux, acessar a pasta onde você deseja trabalhar e
executar o comando:
> octave
Octave 4/43
5. Terminal Octave (2)
Para sair do octave de volta para o terminal do Linux,
basta digitar a palavra 'quit' ou a palavra 'exit'
octave:1> exit
ou
octave:1> quit
O comando 'help <cmd>' imprime na tela a documentação
do comando de nome <cmd>. Esta documentação explica
como o comando deve ser utilizado.
Exemplo: Digite no terminal a frase abaixo e veja a
documentação do comando exit.
octave:1> help exit
Octave 5/43
6. Terminal Octave (3)
O comando 'lookfor <str>' procura pela string
<str> dentro da primeira linha da descrição dos
comandos e funções padrão do Octave.
O comando 'lookfor -all <str>' busca a string
<str> em todo texto dos comandos e das
funções.
Exemplo: digite no terminal do Octave:
octave:1> lookfor help
Octave 6/43
7. Comandos Sobre Arquivos (1)
Alguns comandos sobre o sistema de arquivos do Octave
são iguais aos comandos utilizados pelo terminal do Linux.
Teste o resultado dos seguintes comandos:
Comando para listar conteúdo da pasta atual.
octave:1> ls
Comando para exibir qual é a pasta atual.
octave:2> pwd
Comando para subir um nível em uma pasta:
octave:3> cd ..
Comando para descer para uma pasta de nome <p>:
octave:4> cd <p>
Octave 7/43
8. Comandos Sobre Arquivos (2)
Comando para limpar a tela:
Mantenha a tecla Ctrl pressionada e aperte a tecla l.
Comando para minimizar/maximizar a janela (no
Ubuntu)
Mantenha a tecla Alt pressionada e aperte a tecla F10.
Outra alternativa para sair do Octave:
Mantenha a tecla Ctrl pressionada e aperte a tecla D.
Octave 8/43
9. Comandos Matemáticos
Básicos (1)
Digite um número no terminal do Octave e este
número será repetido no terminal:
Exemplo: octave:1> 3
Digite uma operação aritmética no terminal do
Octave tela e o resultado será impresso:
Exemplo: octave:1> 3 + 5
Exemplo: octave:2> 4 / 9
Exemplo: octave:3> 4 * 4
Exemplo: octave:4> 9 ** 2
Octave 9/43
10. Comandos Matemáticos
Básicos (2)
Existem também algumas funções e constantes pré-definidas
para operações matemáticas mais complexas:
Exemplos:
> sin( 1 )
> cos( 2.1 )
> tan( pi / 4 )
> exp( 3.2 )
Caso tenha dúvidas de como uma dastas funções ou contantes
esteja declarada leia o help da função.
Exemplos:
> help cot
> help tand
Octave 10/43
11. Comandos Matemáticos
Básicos (3)
No Octave, não é necessário declarar variáveis.
Quando você quiser utilizar uma variável, basta
atribuir para ela um determinado valor.
Exemplos:
> a1 = 4
> i = 15 / 2
As variáveis podem ser alteradas.
Exemplo:
> gu = 3
> gu = gu - 10
Octave 11/43
12. Comandos Matemáticos
Básicos (4)
Os nomes das variáveis podem ser quaisquer
palavras compostas por letras maiúsculas e
minúsculas, números e o caractere '_'.
Sugiro que os nomes sejam iniciados com
letras.
Não utilize o nome de uma constante ou função
pré-definida, a não ser que você queira alterar
o valor da constante e não utilizar a função.
Octave 12/43
13. Comandos Matemáticos
Básicos (5)
Existem vários tipos de dados no Octave.
O tipo de dado de uma variável será definido pelo
primeiro valor atribuído a ela.
No caso de atribuição numérica, como nos exemplos
anteriores, o tipo será double.
Existem os tipos escalares:
int8, uint8, int16, uint16, int32, uint32, int64, uint64, double.
Existem ainda números complexos.
Exemplo:
X = 2 + 7.5i
Octave 13/43
14. Comandos Matemáticos
Básicos (6)
Caso você queira que o resultado de uma operação seja
atribuído a uma variável, mas que não seja impresso no
terminal, acrescente um caractere ';' ao final da operação.
Exemplos:
> a = 3.0;
> b = sin( a );
Para apenas visualizar o valor atual de uma variável, digite o
nome dela no terminal.
Exemplo:
> a = 5.5;
>a
Octave 14/43
15. Comandos de Vetores e
Matrizes (1)
Para declarar uma matriz com valores pré-definidos, basta inserir os valores
entre colchetes, separando as colunas por ',' e as linhas por ';'.
Exemplo de atribuição de matriz 3x3 pré-definida a uma variável de nome A:
> A = [ 1, 1, 2; 3, 5, 8; 13, 21, 34 ];
É possível também gerar uma matriz de números aleatórios:
Exemplo de atribuição de matriz 2x3x4 aleatória a uma variável de nome B:
> B = rand ( 2, 3, 4 );
Para calcular a matriz transposta de uma matriz A digite:
> C = A'
A matriz inversa é dada por:
> D = inv( A );
ou
> E = A^-1
Octave 15/43
16. Comandos de Vetores e
Matrizes (2)
É possível também resolver sistemas por matrizes com comando x = A b, onde
A é matriz 2x2 e B é matriz 2x1.
Exemplo:
> A = rand( 2, 2 )
> b = rand( 2, 1 )
>x=Ab
As operações '+', '-' e '*' executam soma, subtração e multiplicação de matrizes.
Exemplo:
> A = rand( 2, 2 )
> b = rand( 2, 1 )
> C = rand( 2, 2 )
>D=A+C
>E=C–A
>f=A*b
Octave 16/43
17. Comandos de Vetores e
Matrizes (3)
Elementos de um vetor ou matriz podem ser acessado por
digitar o nome da variável que contém a matriz e a posição
do elementos entre parêntesis, separando as coordenadas
de cada dimensão por ','.
As coordenadas são definidas entre 1 e n, onde n é o
tamanho da dimensão na coordenada. Se uma ou mais
coordenadas forem omitidas, elas terão valor 1.
Exemplo:
> a = rand( 3,2, 2 )
> a( 1, 2, 2 )
> a( 2,1 )
> a( 3 )
Octave 17/43
18. Comandos de Vetores e
Matrizes (4)
Além de obter o valor de uma determinada coordenada, é
possível atribuir o um valor para o elemento de uma
determinada coordenada de maneira semelhante:
> a = rand( 3, 3 )
> a( 2, 2 ) = 5
Note que se a coordenada for maior que a dimensão da
matriz, o Octave automaticamente aumenta o tamanho da
matriz em todas as dimensões necessárias para
comportar o novo elemento. Os outros elementos
acrescentados terão valor 0:
> a = rand( 2 )
> a( 7, 4 ) = 9
Octave 18/43
19. Comandos de Vetores e
Matrizes (5)
É possível também acessar um intervalo ou todos os
elementos de uma linha, coluna ou sub-matriz. Veja alguns
exemplos:
> v = [ 2, 3, 4, 5, 6 ]
> v( 2 : 4 )
> m = rand( 3, 3 )
> m( :, 1 )
> m( :, 1 : 2 )
> m( 2 : 3, 1 : 2 )
O símbulo ':' indica intervalo. Se nenhum valor for colocado
antes ou depois dele, o valor mínimo e máximo,
respectivamente, são selecionados.
Octave 19/43
20. Comandos de Vetores e
Matrizes (6)
Muitas vezes as funções pré-definidas do Octave que
operam sobre escalares, operam também sobre
matrizes e vetores.
Veja alguns exemplos:
> n = rand( 10, 1 )
> sin( n )
> m = rand( 3, 3 )
> exp( m )
Como veremos adiante, esta regra normalmente se
aplica também a funções desenvolvidas pelo usuário.
Octave 20/43
21. Comandos de Vetores e
Matrizes (7)
Algumas funções interessantes para manipulação de
matrizes e vetores são:
rows: retorna o número de linhas de uma matriz.
columns: retorna o número de colunas de uma matriz.
length: retorna o comprimento de um vetor.
max: retorna o máximo valor máximo de um vetor.
Para retornar o valor máximo de uma matriz 2D de nome mat, basta
utilizar o comando:
max( max( mat ) )
sum: retorna a somatória dos elementos de um vetor.
Para retornar a somatória dos valores de uma matriz 2D de nome mat,
basta utilizar o comando:
sum( sum( mat ) )
Octave 21/43
22. Comandos Lógicos (1)
Os comandos for, while, do-until, if-else, switch-case são funções de
repetição e condicionais. Utilize o comando 'help' para ver a sintaxe de
cada um deles.
Eles podem ser utilizados para percorrer os elementos de vetores e
matrizes e para avaliar condições de desvio e atribuição.
Exemplo de impressão de números pares entre 0 e 50:
> s = 0;
> do
> if( mod( s, 2 ) == 0 )
> s
> endif;
> s++;
> until( s > 4 );
Octave 22/43
23. Comandos Lógicos (2)
Exemplo de percorrer um vetor aleatório e imprimir
apenas os números menores que 0.5 e inverter os
demais números:
> n = rand( 10, 1 )
> for s = 1:10
> if( n(s) < 0.5 )
> n( s )
> else
> n( s ) = 1 / n( s );
> endif
> endfor
Octave 23/43
24. Comandos sobre Imagens (1)
Existem diversos tipos de imagens sobre as quais o Octave
trabalha. Por exemplo, png, pgm, jpg, gif.
Para ler uma imagem de um arquivo basta executar o comando:
> img = imread( “<nome_do_arquivo>” );
Neste caso, img receberá uma matriz contendo a informação de
cada pixel da imagem aberta, sendo 2D para imagens em tons
de cinza e 3D para imagens coloridas.
Os dados da matriz serão do tipo uint8, e não double, como na
atribuição de valores escalares.
Tente abrir alguma imagem em um dos formatos citados pelo
comando imread.
Octave 24/43
25. Comandos sobre Imagens (2)
Para que o Octave exiba uma imagem que está
em uma matriz de nome img, execute o
comando imshow.
Exemplo:
> img = imread( “vegetables.jpg” );
> imshow( img );
Tente abrir uma imagem e visualizá-la pelo
Octave.
Octave 25/43
26. Comandos sobre Imagens (3)
Finalmente, é possível salvar uma imagem
contida em uma matriz de nome img em um
arquivo de nome resultado.jpg pelo comando
imwrite.
Exemplo:
imwrite( img, “resultado.jpg” );
Tente abrir uma imagem pelo comando imread
e salvá-la pelo comando imwrite.
Octave 26/43
27. Comandos sobre Imagens (4)
Para realizar processamentos sobre os dados
de uma imagem, basta percorrer seus
elementos e alterar os seus valores.
Note, porém, que algumas funções do Octave
requerem que o dado utilizado seja do tipo
double.
Neste caso é necessário a conversão de dados
entre os tipos uint8 e double.
Octave 27/43
28. Comandos de Conversão
de Tipos (1)
Para converter um dado de um tipo para outro,
basta chamar uma função definida pelo nome do
tipo desejado.
Conversão de imagem armazenada em matriz de
nome img para números reais:
> img = imread( “minha_imagem.jpg” );
> img = double( img );
Conversão de matriz real de nome result para
inteira sem sinal de 8 bits:
> result = uint8( result );
Octave 28/43
29. Comandos de Conversão
de Tipos (2)
Dependendo de como uma matriz é inicializada, cada
elemento pode ser considerado pelo Octave como um
vetor de uma unidade de números reais, ao invés de
um simples escalar inteiro. Isto pode resultar em
alguns erros, ao executar as funções imshow e
imwrite.
Caso este seja o caso em uma matriz de nome result,
tente o seguinte procedimento:
> result = single( uint8( result ) );
Este comando fará todas as conversões necessárias
para escalares inteiros sem sinal de 8 bits.
Octave 29/43
30. Comandos de Conversão
de Tipos (3)
Existem ainda outros tipos de dados como strings, listas de strings,
registros e arrays de células.
As strings podem ser utilizadas para imprimir textos para o usuário,
muito embora não sejam comumente convertidas para números.
Listas de strings são uma sequência de strings. Elas são acessadas
pelo nome da lista e entre chaves o elemento da lista.
Exemplo: s{ 2 }
Registros são estruturas de dados muito parecidas com resgistros
em C.
Arrays de células são semelhantes a arrays, mas podem possuir em
cada posição um tipo de dado diferente.
Os tipos registro e array de células estão fora do escopo deste curso.
Octave 30/43
31. Funções (1)
Além de utilizar funções do Octave, podemos também
instanciar nossas próprias funções.
As funções em Octave possuem um nome podem ter
vários parâmetros e valores de retorno.
Veremos também como escrever funções em arquivos
para que elas possam ser carregadas toda vez que
inicializarmos o terminal do Octave.
O ideal é que as suas funções sejam agrupadas em
arquivos por alguma semântica, facilitando o seu uso e
documentação.
Octave 31/43
32. Funções (2)
Veja um exemplo de uma função simples, sem
parâmetros e sem retorno:
> function hello( )
> printf( "Hello, World!n" );
> endfunction
A função printf funciona de maneira
praticamente igual à função de mesmo nome
em C.
Octave 32/43
33. Funções (3)
Veja um exemplo de uma função com um
parâmetro e sem retorno:
> function hello2( who = "World" )
> printf( "Hello, %s!n", who );
> endfunction
A função possui um parâmetro do tipo string
chamado who, com valor padrão igual a
“World”.
Octave 33/43
34. Funções (4)
Veja um exemplo de uma função f com um
parâmetro x e uma variável de retorno y:
> function y = f( x )
> y = x ** 2;
> endfunction
Esta função recebe parâmetros de qualquer tipo
numérico e retorna o seu quadrado. Caso x seja
uma matriz quadrada, a função retornará a
multiplicação de x por x. Caso seja uma matriz
não quadrada, um erro irá ocorrer.
Octave 34/43
35. Funções (5)
Veja um exemplo de > function[ m, i ] = vmax( v )
uma função vmax com > i = 1;
um parâmetro de > m = v( i );
entrada v e duas
> for j = 2:length( v )
variáveis de retorno
retorno m e i. > if( v( j ) > m )
> m = v( j );
v é um vetor, m retorna o
maior valor de v e i > i = j;
retorna o índice do maior > endif
valor. > endfor
> endfunction
Octave 35/43
36. Funções (6)
A utilização de funções escritas pelo usuário é feita da mesma
forma que as funções primitivas do Octave.
Veja exemplos de como chamar as funções instanciadas nos slides
anteriores:
> hello( )
> hello2( )
> hello2( “People” )
> b = f( 4 )
> x = [ 1, 2, 3, 4, 5 ];
> [ m, I ] = vmax( x )
Note que a função vmax requer duas variáveis de retorno. Elas são
especificadas entre colchetes e separadas por vírgulas.
Octave 36/43
37. Funções (7)
Como dito anteriormente, é melhor que as funções
criadas sejam gravadas em um arquivo.
Um arquivo com funções pode ser carregado utilizando-
se o comando source.
> source( “meu.m” );
Exemplo:
Crie um arquivo de nome teste.m e salve-o na pasta de
trabalho do Octave.
Escreva algumas funções dentro deste arquivo.
Carregue o arquivo pelo comando source.
Execute alguma das funções contidas em teste.m.
Octave 37/43
38. Scripts (1)
Outra opção que o Octave oferece é de escrever arquivos de
script que podem ser executados diretamente do terminal do
Linux.
Um arquivo de script do Octave é um arquivo texto pode ter
qualquer extensão.
Um arquivo de script de Octave sempre começa com o
comando:
#! /usr/bin/octave -qf
Depois, ele pode conter declaração de funções e a execução
de uma sequência de comandos desejada.
Exceto no caso da primeira linha, o símbolo '#' corresponde
a um comentário.
Octave 38/43
39. Scripts (2)
Alguns comandos só funcionam em scripts como é o caso
dos comandos abaixo:
A função scanf( ) funciona de maneira semelhante ao scanf da
linguagem C, mas retorna o valor lido, ao invés de armazená-lo
em um endereço passado como arqumento. O segundo
arqumento do scanf é o número de vezes que o valor será lido.
> a = scanf( “%d”, 1 );
A função program_name( ) retorna o nome do script.
A variável nargin contém o número de parâmetros entrados ao
executar o script.
A função argv( ) retorna uma lista de strings contendo os
parâmetros entrados para executar o script.
Octave 39/43
40. Scripts (3)
Veja um exemplo de um script que utiliza
alguns dos comandos anteriores:
#! /usr/bin/octave -qf
printf ( "%s", program_name( ) );
arg_list = argv( );
for i = 1:nargin
printf ( " %s", arg_list{ I } );
endfor
printf ( "n" )
Octave 40/43
41. Scripts (4)
Outro exemplo de programa, agora que utiliza a função scanf e
que contém um comentário:
#! /usr/bin/octave -qf
# um comentario!!!
who = scanf( "%s", 1 );
printf( "Hello %s!n", who );
Exercício: Crie um arquivo para cada um dos scripts dados e
execute-os pelo terminal do Linux.
Você precisa ter permissão para executar um arquivo pelo terminal
do Linux.
Assim, acesse a pasta onde você escreveu o arquivo de script e
antes de executá-lo execute o seguinte comando.
chmod +x <nome_do_arquivo>
Octave 41/43
42. Erros Comuns (1)
Existem dois tipos de erros no Octave: os erros de
sintaxe, que ocorrem quando você escreve alguma
palavra errada e os erros de execução, quando não
é possível executar uma função ou operação, muito
embora não haja erro de sintaxe.
Um erro de sintaxe simples é dado por executar o
comando:
> a = b *** 3
Neste caso, o Octave indicará que houve erro de
sintaxe e pode até mesmo apontar o local de onde o
erro ocorreu.
Octave 42/43
43. Erros Comuns (2)
Os erros de execução geralmente são mais difíceis de se
encontra do que os de sintaxe, pois sua mensagem nem sempre
é fácil de compreender.
Um exemplo de erro de sintaxe é a execução abaixo:
> a = [ 2, 3 ]
> b = a * a;
Este erro ocorre porque o número de colunas de a teria de ser
igual ao de linhas, para que a multiplicação de matrizes fosse
possível.
O código abaixo gera um erro semelhante, mas é mais fácil de se
identificar.
> a = [ 2, 3 ]
> b = a ** 2;
Octave 43/43