Instituto Superior Técnico,
Dep. de Engenharia Mecânica - ACCAII
Programação em MATLAB
• Estruturas de Repetição
• Ciclo WHILE
• As instruções BREAK e RETURN
• A função ERROR
• Vectorização
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Estruturas de repetição no MATLAB
2
• Estruturas de repetição disponíveis no MATLAB:
• Estruturas de repetição:
• instrução for
• O ciclo FOR permite que uma sequência de instruções seja executada mais do que uma vez.
• O ciclo FOR repete um bloco de instruções um determinado número de vezes. Esse número de vezes é especificado antes do ciclo ser executado.
• instrução while
• O ciclo WHILE repete o bloco de instruções enquanto a condição associada for verdadeira.
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while
3
Descrição: Repete um bloco de instruções um número indefinido de vezes.
Sintaxe: while expression
statement_1
.
.
statement_n
end
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while
4
FLUXOGRAMA:
Expression
T
F
Statement
Expression
T
F
Statement
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo1
5
Problema: Escreva uma função que receba uma valor escalar e que retorne o valor de um factorial (n!) que seja superior a esse valor.
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo1
6
>> compara_com_fact(5000)
ans =
5040
>> compara_com_fact(-1000)
ans =
1
>>
Exemplo de execução:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo2
7
• Quando uma bola é largada, ressalta parapara ½ do sua altura anterior.
• Queremos um programa que efectue esta simulação
• Peça ao utilizador a altura inicial da bola, em metros.
• Mostre o número de cada ressalto e a respectiva altura
• Repita até que a altura do ressalto é muito pequena(exemplo: 1mm)
Problema:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo2
8
1. Inicializar numRessaltos a 0 (zero)
2. Perguntar e ler valor de altura
3. Mostrar o valor original de altura com descrição
4. Ciclo:
a. Se altura < LIMITE_ALTURA, termina ciclo
b. Actualizar altura para altura/2
c. Adicionar 1 a numRessaltos
d. Mostrar numRessaltos e altura
5. Fim do ciclo
Algoritmo:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo2
9
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo2
10
Introduza altura inicial, em metros: 7.5
Altura inicial = 7.500 metros
Ressalto nº 1 possui uma altura de 3.750 metros
Ressalto nº 2 possui uma altura de 1.875 metros
Ressalto nº 3 possui uma altura de 0.938 metros
Ressalto nº 4 possui uma altura de 0.469 metros
Ressalto nº 5 possui uma altura de 0.234 metros
Ressalto nº 6 possui uma altura de 0.117 metros
Ressalto nº 7 possui uma altura de 0.059 metros
Ressalto nº 8 possui uma altura de 0.029 metros
Ressalto nº 9 possui uma altura de 0.015 metros
Ressalto nº 10 possui uma altura de 0.007 metros
Ressalto nº 11 possui uma altura de 0.004 metros
Ressalto nº 12 possui uma altura de 0.002 metros
Ressalto nº 13 possui uma altura de 0.001 metros
>>
Exemplo de execução:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo3
11
• A instrução WHILE pode ter associada múltiplas condições.
• Exemplo: considere o seguinte problema.
Problema: Escreva uma função que possua como argumento de entrada um vector, e que retorne o valor lógico true se, e se só se, o vector for composto por valores maiores ou iguais a zero e inteiros.
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo3
12
Qual é a vantagem relativamente à utilização de um ciclo FOR ?
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo4
13
• Pode ser necessário fazer uma contagem, sem se saber, à partida, o número de valores introduzidos
• Exemplo: considere o seguinte problema.
Problema: Escreva um script que vá pedindo números positivos ao utilizador (-1 para terminar), e que no fim apresente a média dos valores introduzidos.
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo4
14
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo4
15
>> calcula_media
Introduza um valor >=0 [-1 para terminar]: 2
Introduza um valor >=0 [-1 para terminar]: 4
Introduza um valor >=0 [-1 para terminar]: -1
A média = 3.00
>> calcula_media
Introduza um valor >=0 [-1 para terminar]: -1
Não inseriu nenhum valor >=0!!
>>
Exemplos de execução:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo5
16
• Como utilizar o ciclo WHILE para verificar erros de introdução de valores.
• Exemplo: considere o seguinte problema.
Problema: Escreva um script que peça ao utilizador um valor inteiro, e que só permita avançar na execução, quando o número for realmente um inteiro.
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo5
17
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo5
18
>> teste1
Introduza um valor inteiro: 3.5
O valor introduzido não é um inteiro!!
Introduza um valor inteiro: -1.0
Agora sim !!! O valor -1 é um inteiro!!
>>
Exemplos de execução:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo6
19
Outra possível solução:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução while exemplo6
20
>> teste2
Introduza um valor inteiro: 76.8
O valor introduzido não é um inteiro!!
Introduza um valor inteiro: 65
Agora sim !!! O valor 65 é um inteiro!!
>>
Exemplos de execução:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução break
21
Descrição: Termina a execução de um ciclo FOR ou de um ciclo while. Em ciclos encadeados, a instrução BREAK termina a execução do ciclo a que está associado.
• Exemplo: while(true)
statement_1
.
if (condição == true)
break;
end
.
statement_n
end
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Instrução return
22
Descrição: A instrução RETURN , se utilizada dentro de uma função (ou script), termina a sua execução, causando um retorno à entidade que a invocou.
• Exemplo:
function d = det(A)
if isempty(A)
d = 1;
return
else
...
end
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
A função error exemplo7
23
Descrição: A função ERROR apresenta no monitor uma mensagem de erro, e aborta a função.
• Exemplo:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização.
24
• Muitas vezes me MATLAB, não é necessário implementar ciclos.
• Uma vez que o MATLAB foi originalmente concebido para manipular vectores e matrizes, muitos operadores podem ser utilizados com este tipo de operandos.
• Em geral, também as funções pré-definidas no MATLAB, operam sobre vectores e matrizes.
• Concluindo: a vectorização permite evitar a implementação de ciclos, e logo tornar os programas mais eficientes.
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização: exemplos
25
>> vec_1 = [1 2 3]
vec_1 =
1 2 3
>> vec_2 = vec_1*10
vec_2 =
10 20 30
>> vec_3 = vec_1/2
vec_3 =
0.5000 1.0000 1.5000
>> vec_4 = vec_1+5
vec_4 =
6 7 8
NOTA:
Todos estes cálculos poderião
ter sido implementados com
ciclos FOR !
Faça os mesmos testes para:
mat_1=[1 2;3 4]
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização
26
>> vec_5 = vec_1^2
??? Error using ==> mpower
Matrix must be square.
>> vec_5 = vec_1.^2
vec_5 =
1 4 9
>> vec_6 = vec_1 .* vec_5
vec_6 =
1 8 27
Operadores elemento a elemento ou operadores sobre arrays:
.^
.*
./
Operadores elemento a elemento:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização: exemplo
27
for ii = 1:100
quadrado(ii) = ii^2;
raiz_quadrada(ii) = ii^(1/2);
raiz_cubica(ii) = ii^(1/3);
end
ii = 1:100;
quadrado = ii.^2;
raiz_quadrada = ii.^(1/2);
raiz_cubica = ii.^(1/3);
Operadores elemento a elemento:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização:
28
>> vec_7 = [5 3 45 38 7]
vec_7 =
5 3 45 38 7
>> vec_8_log = vec_7 > 6
vec_8_log =
0 0 1 1 1
%Como criar um vector só os
%componentes >7 de vec_7????
>> vec_9 = vec_7(vec_8_log)
vec_9 =
45 38 7
Os operadores relacionais podem ser utilizados em vectores e matrizes, e devolvem vectores ou matrizes do tipo lógico.
Vectores lógicos:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização:
29
>> vec_10 = [1 0 1 0 1];
>> vec_11 = [0 1 1 1 0];
>> vec_12 = vec_10 & vec_11
vec_12 =
0 0 1 0 0
vec_13 =
1 1 1 1 1
>> vec_14 = ~vec_13
vec_14 =
0 0 0 0 0
Os operadores lógicospodem ser utilizados em vectores e matrizes, e devolvem vectores ou matrizes to tipo lógico.
Operadores:
&
|
~
Vectores lógicos:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização:
30
>> vec_15 = [1 0 1 0 0];
>> vec_16 = [0 0 0 0 0];
>> vec_17 = [1 1 1 1 1];
>> any(vec_15)
ans =
1
>> any(vec_16)
ans =
0
>> any(vec_17)
ans =
1
Funções lógicas pré-definidas no MATLAB, que operam sobre vectores (e matrizes). (NOTA: em matrizes as operações são coluna a coluna)
Funções:
any – devolve true se existir pelo menos um valor true no vector.
all – devolve true se todos os elementos do vector forem true.
Funções lógicas pré-definidas no MATLAB:
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Vectorização:
31
>> vec_15 = [1 0 1 0 0];
>> vec_16 = [0 0 0 0 0];
>> vec_17 = [1 1 1 1 1];
>> all(vec_15)
ans =
0
>> all(vec_16)
ans =
0
>> all(vec_17)
ans =
1
Funções lógicas pré-definidas no MATLAB, que operam sobre vectores (e matrizes). (NOTA: em matrizes as operações são coluna a coluna)
Funções:
any – devolve true se existir pelo menos um valor true no vector.
all – devolve true se todos os elementos do vector forem true.
Funções lógicas pré-definidas no MATLAB (cont.):
Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010
Referências
32
• Capítulo 4 de Stormy Attaway (2009), “Matlab: A Practical Introduction to Programming and Problem Solving”, Elsevier.
• Getting started with MATLAB: http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/getstart.pdf