MATLAB
Programação básica
2João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Tipo de dados logical
Podem ter valores true ou false.Dados do tipo lógico podem ser utilizados com valores numéricos. São convertidos nos valores 0 e 1. Operadores relacionais
Símbolo Significado < Menor que > Maior que == Igual a <= Menor ou igual a >= Maior ou igual a ~= Diferente de
3João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Saída de dados do tipo logical
4João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Comparação de reais
>> a = 0;>> b = sin(pi);>> a == bans =
0
Porquê?Devido a erros de arredondamento, b = 1.2246e-16.
>> abs(a - b) < 1.0E-14ans =
1
5João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Operadores lógicos
Operadores lógicos Significado & E (AND) lógico && E (AND) lógico com avaliação parcial | OU (OR) lógico || OU (OR) lógico com avaliação parcial xor OU exclusivo ~ NÃO (NOT) lógico
x = a/b > 10.0
E se b é zero?x = (b ~= 0) && (a/b > 10.0)
Se b é zero, a segunda expressão não é avaliada; retorna logo falso.
6João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Hierarquia de operações lógicas
Prioridade dos operadores:1. Todas as expressões aritméticas.2. Todos os operadores relacionais (==, ~=, >, >=, <, <=) da
esquerda para a direita.3. Todas as negações, ~, são avaliadas.4. Todos os operadores & e && são avaliados da esquerda para
a direita.5. Todos os operadores |, ||, e xor são avaliados da esquerda
para a direita.
7João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Funções lógicas intrínsecas
ischar(a) – retorna true se a for uma variável do tipo caracter.isempty(a) – retorna true se a for vazia.isinf(a) – retorna true se a for infinito (Inf).isnan(a) – retorna true se a não for um número, ou seja, se for NaN.isnumeric(a) – retorna true se a for um arraynumérico.logical(a) – converte um valor numérico num valor lógico. Se a for zero retorna falso, e verdadeiro caso contrário.
8João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Estruturas de selecção
Construção if____________________________________________________________________________
if expressao_logica1atribuição1atribuição2...
elseif expressao_logica2atribuição1atribuição2...
elseatribuição1atribuição2...
end
9João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo: cálculo de raízes% Ficheiro script: calcula_raizes.m% Este programa calcula as raizes uma equacao quadratica da% forma a*x^2 + b*x + c = 0, sejam elas reais ou complexas. % Data Programador Descricao da alteracao% ==== ============= =====================% 15/04/06 Joao M. C. Sousa Codigo original %% Definicao das variavais:% a -- Coeficiente em x^2% b -- Coeficiente em x% c -- Termo constante% discriminante -- Discriminante% parte_imag -- Parte imaginaria da equacao (para raizes complexas)% parte_real -- Parte real da equacao (para raizes complexas) % x1 -- Primeira solucao da equacao (para raizes reais)% x2 -- Segunda solucao da equacao (para raizes reais)
% Pergunta ao utilizador os coeficientes da equacaodisp('Este programa calcula as raizes de uma equacao');disp('quadratica da forma a*x^2 + b*x + c = 0.' );a = input('Introduza o coeficiente a: ');b = input('Introduza o coeficiente b: ');c = input('Introduza o coeficiente c: ');
10João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo: cálculo de raízes (2)
% Calcula o discriminantediscriminante = b^2 - 4 * a * c;
% Calcula as raizes dependendo do valor do discriminanteif discriminante > 0 % ha duas raizes reais
x1 = (-b + sqrt(discriminante)) / (2*a);x2 = (-b - sqrt(discriminante)) / (2*a);disp('Esta equacao tem duas raizes reais:');fprintf('x1 = %f\n', x1);fprintf('x2 = %f\n', x2);
elseif discriminante == 0 % ha uma raiz duplax1 = -b / (2*a);disp('Esta equacao tem uma raiz dupla:');fprintf('x1 = x2 = %f\n', x1);
else % existem duas raizes complexasparte_real = -b / (2*a);parte_imag = sqrt(abs(discriminante)) / (2*a);disp ('Esta equacao tem raizes complexas:');fprintf('x1 = %f +i %f\n', parte_real, parte_imag );fprintf('x1 = %f -i %f\n', parte_real, parte_imag );
end
11João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Construção switch
switch(expressao)case {valor1,valor2}
atribuição1atribuição2...
case valor3,atribuição1atribuição2...
...otherwise,
atribuição1atribuição2...
end
12João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo de switch
A construção determina se um inteiro entre 1 e 10 épar ou ímpar:
switch(valor)case {1,3,5,7,9},
disp(‘O valor é impar’);case {2,4,6,8,10},
disp(‘O valor é par’);otherwise,
disp(‘O valor nao está entre 1 e 10’);end
13João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Construção try/catch
Forma para detectar erros. Envia mensagens de erro para o utilizador.
tryatribuição1atribuição2...
catchatribuição1atribuição2...
end
14João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo de try/catch
Exemplo no ficheiro try_catch.m
% Inicializa vector
a = [1 -3 2 5];
try% Tenta escrever um elementoindice = input('Insira indice de elemento a escrever: ');disp(['a(' int2str(indice) ') = ' num2str(a(indice))]);
catch% Se ocorrer um erro:disp(['Indice errado: ' int2str(indice)]);
end
15João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo de execução
>> try_catchInsira indice de elemento a escrever: 2a(2) = -3>> try_catchInsira indice de elemento a escrever: 4a(4) = 5>> try_catchInsira indice de elemento a escrever: 21
Indice errado: 21
16João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Ciclo while
while expressaoatribuição1atribuição2......
end
17João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo: média e desvio padrão
% Script file: estatisticas.m% Calcula a media e o desvio padrao de dados com % um numero arbitrario de entradas.%% Registo das revisões:% Data Programador Descricao das alteracoes% ===== ============== ========================% 18/04/06 Joao M. C. Sousa Codigo original%% Variaveis:% n -- Numero de entradas% desv_pad -- Desvio padrao das entradas dadas% soma_x -- Soma das entradas% soma_x2 -- Soma das entradas ao quadrado% x -- Um dado valor de entrada% media -- Media dos valores dados
% Inicializa somas.n = 0; soma_x = 0; soma_x2 = 0;
% Le o primeiro valor
x = input('Introduza o primeiro valor (valor negativo para acabar): ');
18João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo: média e desvio padrão (2)% Ciclo while para ler os dados de entrada.while x >= 0
% Somas acumuladasn = n + 1;soma_x = soma_x + x;soma_x2 = soma_x2 + x^2;
% Le o proximo valorx = input('Introduza o valor seguinte (valor negativo para acabar):');
end
% Verifica se existem dados suficinetesif n < 2 % Dados insuficientes
disp('E'' necessario introduzir 2 valores no minimo!');else % calcula a media e o desvio padrao
media = soma_x / n;desv_pad = sqrt( (n*soma_x2 - soma_x^2) / (n*(n-1)) );
% Escreve resultadosfprintf('A media dos dados e'': %f\n', media);fprintf('O desvio padrao e'': %f\n', desv_pad);fprintf('O numero total de pontos e'': %f\n', n);
end
19João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Ciclo for
for indice = expressãoatribuição1atribuição2......
end
20João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo: cálculo do dia do ano
% Script file: diadoano.m%% Este programa calcula o dia do ano correspondente a uma data% especificada. Utiliza as construcoes switch e for.%% Registo das revisões:% Data Programador Descricao das alteracoes% ===== ============== ========================% 26/04/06 Joao M. C. Sousa Codigo original%% Variaveis:% dia -- dia (dd)% dia_do_ano -- dia do ano% ii -- indice do ciclo% dia_extra -- dia_extra dos anos bissextos% mes -- mes (mm)% ano -- ano (aaaa)
% Pegunta o dia, mes e ano ao utilizadordisp('Este programa calcula o dia do ano para uma ');disp('data especificada.');dia = input('Qual e'' o dia actual(1-31)? ');mes = input('Qual e'' o mes actual(1-12)? ');ano = input('Introduza o ano(com 4 digitos): ');
21João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplo: cálculo do dia do ano (2)% Verifica se e' ano bissextoif rem(ano,400) == 0
dia_extra = 1; % Anos divisiveis por 400 sao bissextoselseif rem(ano,100) == 0
dia_extra = 0; % Outros seculos nao sao bissextoselseif rem(ano,4) == 0
dia_extra = 1; % Caso contrario, todo o 4º ano e' bisextoelse
dia_extra = 0; % Os outros anos nao sao bissextosend
% Calcula o dia do ano, adicionando o dia actual aos dias dos meses anterioresdia_do_ano = dia;for ii = 1:mes-1
% Adiciona dias do mes de Jasneiro ate' ao mes anteriorswitch (ii)
case {1,3,5,7,8,10,12},dia_do_ano = dia_do_ano + 31;
case {4,6,9,11},dia_do_ano = dia_do_ano + 30;
case 2,dia_do_ano = dia_do_ano + 28 + dia_extra;
endend
% Saida de resultadosfprintf('A data %2d/%2d/%4d é o dia do ano %d.\n', dia, mes, ano, dia_do_ano);
22João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Arrays como índices
Os índices de um ciclo for podem ser arrays. Considere-se uma array A de m × n:A instruçãofor ii = A,
atribuiçõesend
atribui a ii o vector A(:,k). Na primeira iteração, k é igual a1; na segunda iteração k é igual a 2, etc., até que k é igual a n. Ou seja, o ciclo é repetido o número de vezes igual ao número de colunas de A. Em cada iteração, i é um vector contendo uma das colunas de A.
23João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplos
for ii = 1:2:11atribuição_1...atribuição_n
end
for ii = [1 2 3; 4 5 6]atribuição_1...atribuição_n
end
24João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Vectorização
Torna os cálculos mais rápidos.Exemplo:
for ii = 1:100quadrado(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);
Segunda forma pode ser 15 a 20 vezes mais rápida!
25João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Intruções return e break
returnreturn termina a sequência de comandos a ser executada e devolve o controlo à função anterior ou ao teclado.
breakA instrução break termina a execução de um ciclo for ouwhile. A execução continua com a primeira instrução fora do ciclo. Em ciclos encadeados, break acaba apenas com o ciclo mais interior.
26João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Arrays lógicos e vectorização
É muito fácil criar arrays do tipo lógico.Exemplo:
>> a = [1 2 3; 4 5 6; 7 8 9];>> b = a > 5b =
0 0 00 0 11 1 1
Se quisermos calcular a raíz quadrada dos elementos > que 5:>> a(b) = sqrt(a(b))a =
1.0000 2.0000 3.00004.0000 5.0000 2.44952.6458 2.8284 3.0000
27João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Comparação com e sem vectorização
a = [1 2 3; 4 5 6; 7 8 9];for ii = 1:size(a,1)
for jj = 1:size(a,2)if a(ii,jj) > 5
a(ii,jj) = sqrt(a(ii,jj));end
endend
Ou:a = [1 2 3; 4 5 6; 7 8 9];b = a > 5a(b) = sqrt(a(b))
Dá o mesmo resultado (na página anterior). A segunda forma émuito mais rápida!
28João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Comandos tic, toc
tic – inicia um contador de tempo.
toc – retorna o tempo decorrido, em segundos, desde o último tic. Pode retornar o valor para uma variável.