MATLAB
Funções
Funções em Matlab
Subprogramas em Matlab são funções.
function [saida1, saida2,...] = nome_funcao(ent1, ent2,...)
% Comentário numa linha que diz o que faz a função
% Mais comentários
% Até esta linha aparecem no help
% Estes comentários já não aparecem no help
Código executável
...
(return)
(end)
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
2
Exemplo: função cálculo distancia
function distancia = dist2(x1,y1,x2,y2)
% DIST2 calcula a distancia entre dois pontos
% A funcao DIST2 calcula a distancia entre os
% pontos (x1,y1) e (x2,y2) no sistema cartesiano.
%
% Chamada: distancia = dist2(x1,y1,x2,y2)
%
%
%
%
%
%
%
Variaveis:
x1
- posicao x
y1
- posicao y
x2
- posicao x
y2
- posicao y
distancia – distancia
Revisoes (...)
do ponto
do ponto
do ponto
do ponto
entre os
1
1
2
2
dois pontos
% Calcula distancia
distancia = sqrt((x2-x1).^2 + (y2-y1).^2)
end
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
3
Teste à função dist2
%
%
%
%
%
%
%
%
%
%
%
%
Script file: testa_dist2.m
Este programa testa a função dist2
Registo das revisões:
(...)
Variaveis:
a_x
- posicao x do ponto a
a_y
- posicao y do ponto a
b_x
- posicao x do ponto b
b_y
- posicao y do ponto b
result
– distancia entre os dois pontos
% Entrada de dados
disp('Calculo da distancia entre dois
a_x = input('Introduza a coordenada x
a_y = input('Introduza a coordenada y
b_x = input('Introduza a coordenada x
b_y = input('Introduza a coordenada y
pontos')
do ponto
do ponto
do ponto
do ponto
a:
a:
b:
b:
');
');
');
');
% Testa a função
result = dist2(a_x, a_y, b_x, b_y);
% Escreve o resultado
fprintf('A distancia entre os pontos A e B e'' %f\n', result);
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
4
Passagem de parâmetros
O Matlab passa os parâmetros das funções por valor.
Quando uma função muda os valores dos argumentos,
estes não são alterados no programa que a chamou.
Exemplo:
function saida = exemplo(a, b)
fprintf('No exemplo:
a = %f, b = %f %f\n', a, b)
a = b(1) + 2*a;
b = a .* b;
saida = a + b(1);
fprintf('No exemplo:
a = %f, b = %f %f\n', a, b)
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
5
Exemplo de passagem de parâmetros
Teste da função exemplo.m:
% Script file: testa_exemplo.m
a = 2; b = [6 4];
fprintf('Antes do exemplo: a = %f, b = %f %f\n', a, b)
saida = exemplo(a, b);
fprintf('Depois do exemplo: a = %f, b = %f %f\n', a, b)
fprintf('Depois do exemplo: saida = %f\n', saida)
Execução no Matlab:
>> testa_exemplo
Antes do exemplo:
No exemplo:
No exemplo:
Depois do exemplo:
Depois do exemplo:
João Sousa – Miguel Pedro Silva
a = 2.000000, b = 6.000000 4.000000
a = 2.000000, b = 6.000000 4.000000
a = 10.000000, b = 60.000000 40.000000
a = 2.000000, b = 6.000000 4.000000
saida = 70.000000
Computação e Programação 2007 / 2008
6
Exemplo: conversão de coordenadas
function [r, theta] = cart2polar(x, y)
%CART2POLAR converte coordenadas cartesianas em polares
% Funcao CART2POLAR aceita cordendas cartesianas (x,y), e converte-as
% em coordenadas polares (r,theta), onde theta e' dada em graus
%
% Chamada da função:
%
[r, theta] = cart2polar(x, y)
% Variaveis:
%
r
-- comprimento do vector polar
%
theta
-- angulo do vector em graus
%
x
-- posicao x do ponto
%
y
-- posicao y do ponto
% Registo das revisões:
%
Data
Programador
Descricao das alteracoes
%
========
================
========================
%
02/05/06
Joao M. C. Sousa
Codigo original
r = sqrt( x.^2 + y .^2 );
theta = 180/pi * atan2(y,x);
end % funcao cart2polar
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
7
Exemplos de execução
Existe também a função polar2cart.
Exemplos a testar no Matlab:
¾
¾
¾
¾
[r,
[r,
[r,
[r,
theta]
theta]
theta]
theta]
¾
¾
¾
¾
[x,
[x,
[x,
[x,
y]
y]
y]
y]
João Sousa – Miguel Pedro Silva
=
=
=
=
=
=
=
=
cart2polar(4,3)
cart2polar(-4,3)
cart2polar(-4,-3)
cart2polar(4,-3)
polar2cart(5,36.8699)
polar2cart(5,143.1301)
polar2cart(5,-143.1301)
polar2cart(5,-36.8699)
Computação e Programação 2007 / 2008
8
Recursão
Considere-se a função para calcular o factorial
⎧1
n! = ⎨
⎩1× 2 × ... × n
se n is 0
se n > 0
Pode ser definida de forma recursiva:
se n is 0
⎧1
n! = ⎨
⎩n × (n − 1)! se n > 0
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
9
Recursão
Uma definição recursiva tem duas partes
1. Uma âncora ou base (caso mais simples)
O valor é especificado para um ou mais valores dos
parâmetro(s)
2. Um passo inductivo ou recursivo
O valor do parâmetro é especificado em função dos valores
ou parâmetros mais simples.
se n is 0
⎧1
n! = ⎨
⎩n × (n − 1)! se n > 0
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
10
Recursão
Para calcular 5! seguem-se os seguintes passos:
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
11
Função recursiva
Código da função factorial, programada de forma
recursiva (em MATLAB):
function resultado = factorial(n)
if (n < 0 || round(n)~=n)
error('O argumento deve ser um inteiro >=0.');
elseif (n == 0)
Caso
Casomais
maissimples
simples
resultado = 1;
else
resultado = n * factorial(n-1);
end
Passo
Passoinductivo
inductivo
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
12
Função recursiva
Código da função factorial, programada de forma
recursiva (em C++):
int factorial (int n)
{
Caso
Casomais
maissimples
simples
assert (n >= 0);
if (n == 0)
return 1;
else
return n * factorial (n – 1);
}
Passo
Passoinductivo
inductivo
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
13
Execução da função recursiva
Sequência de passos recursivos quando é chamada
int numero = factorial(4);
Chamadas
recursivas
sucessivas
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
14
Execução da função recursiva
Quando factorial(n–1) envia por fim o valor 0
como parâmetro, é executada a instrução âncora
Não há mais chamadas recursivas
...
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
15
Execução da função recursiva
Os valores calculados vão sendo retornados:
66
22
11
24
24
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
16
Argumentos opcionais
O Matlab pode ter argumentos opcionais.
As funções nargin e nargout permitem determinar
o número de argumentos de entrada e de saída.
Podem ser utilizadas condições para realizar acções
dependendo do número de argumentos.
nargchk – retorna uma mensagem de erro se função
for chamada com um número de argumentos errado.
As funções error e warning podem ser utilizadas
para escrever mensagens de erro ou de aviso.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
17
Exemplo: cart2polar_2
function [magn, angulo] = cart2polar_2(x,y)
%CART2POLAR converte coordenadas cartesianas em polares
% Funcao CART2POLAR aceita cordendas cartesianas (x,y), e converte-as
% em coordenadas polares (r,theta), onde theta e' dada em graus
% Ilustra a utilizacao de argumentos opcionais
% Variaveis:
%
msg
-- mensagem
%
magn
-- magnitude
%
angulo
-- angulo em graus
%
x
-- posicao x do ponto
%
y
-- posicao y do ponto (opcional)
%
%
%
%
Registo das revisões:
Data
Programador
========
================
06/05/06
Joao M. C. Sousa
Descricao das alteracoes
========================
Codigo original
% Testa se o numero de argumentos e' correcto.
msg = nargchk(1,2,nargin);
error(msg);
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
18
Exemplo: cart2polar_2
% Se nao for dado o argumento y, atribui-lhe o valor 0.
if nargin < 2
y = 0;
end
% Verifica se os argumentos de entrada sao (0,0),
% e nesse caso escreve uma mensagem de aviso (warning).
if x == 0 & y == 0
msg = 'Ambos x e y sao zero: o angulo nao tem significado!';
warning(msg);
end
% Calcula a magnitude.
magn = sqrt(x.^2 + y.^2);
% Se existe segundo argumento de saida, calcula
% o angulo em graus.
if nargout == 2
angulo = atan2(y,x) * 180/pi;
end
end % funcao cart2polar_2
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
19
Exemplos de execução
>> [r ang]=cart2polar_2
??? Error using ==> cart2polar_2
Not enough input arguments.
>> [r ang]=cart2polar_2(1,-1,1)
??? Error using ==> cart2polar_2
Too many input arguments.
>> [r ang]=cart2polar_2(1)
r =
1
ang =
0
>> [r ang]=cart2polar_2(1,-1)
r =
1.4142
ang =
-45
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
20
Exemplos de execução (2)
>> r = cart2polar_2(1,-1)
r =
1.4142
>> [r ang]=cart2polar_2(1,-1)
r =
1.4142
ang =
-45
>> [r ang]=cart2polar_2(0,0)
Warning: Ambos x e y sao zero: o angulo nao tem significado!
> In cart2polar_2 at 32
r =
0
ang =
0
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
21
Variáveis globais
Podem ser definidas da seguinte forma:
global VAR1 VAR2 VAR3 ...
As variáveis globais são em geral definidas em
maiúsculas para serem facilmente reconhecidas.
As variáveis globais devem ser definidas
imediatamente após os comentários iniciais.
Devem ser evitadas. Podem ser utilizadas para passar
grandes quantidades de dados entre funções.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
22
Funções de funções
fzero – encontra o zero de funções de uma variável:
>> fzero('cos(x)', [0 pi])
ans =
1.5708
>> fzero('exp(x)-2', [0 1])
ans =
0.6931
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
23
Funções eval e feval
>> x = eval('sin(pi/4)')
x =
0.7071
Exemplo:
x = 1;
cadeia = ['exp(' num2str(x) ') -1'];
res = eval(cadeia);
retorna: 'exp(1) -1', logo
res = eval('exp(1) -1') e tem o valor de 1.7183.
>> x = feval('sin', pi/4)
x =
0.7071
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
24
Exemplo: função plot_rapido
function plot_rapido(fun,lim_x)
%PLOT_RAPIDO faz os graficos de uma função de forma rapida
% Funcao PLOT_RAPIDO faz os graficos de uma
% função numa m-file entre os limites xlim especificados.
% Variaveis:
%
fun
-- Funcao para fazer o
%
msg
-- Mensagem de erro
%
n_passos -- Numero de passos no
%
tam_passo -- Tamanho do passo
%
x
-- Valores em x para o
%
y
-- Valores em y para o
%
lim_x
-- Limites em x para o
%
% Registo das revisões:
%
Data
Programador
%
========
================
%
06/05/06
Joao M. C. Sousa
grafico
grafico
grafico
grafico
grafico (dados pelo utilizador)
Descricao das alteracoes
========================
Codigo original
% Testa se o numero de argumentos e' correcto.
msg = nargchk(2,2,nargin);
error(msg);
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
25
Exemplo: função plot_rapido
% Verifica se o 2º argumento tem dois elementos.
% Poderá assim ser um vector linha ou coluna.
if (size(lim_x,1) == 1 & size(lim_x,2) == 2) | ...
(size(lim_x,1) == 2 & size(lim_x,2) == 1)
n_passos = 100;
tam_passo = (lim_x(2) - lim_x (1)) / n_passos;
x = lim_x (1):tam_passo:lim_x (2);
y = feval(fun,x);
plot(x,y);
title(['\bfGrafico da funcao ' fun '(x)']);
xlabel('\bfx');
ylabel(['\bf' fun '(x)']);
else
% O numero de elementos em lim_x esta' incorrecto.
error('Numero de elementos em lim_x incorrecto');
end
end % funcao plot_rapido
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
26
Exemplos de execução
>> plot_rapido
??? Error using ==> plot_rapido
Not enough input arguments.
Grafico da funcao sin(x)
1
>> plot_rapido('sin')
??? Error using ==> plot_rapido
Not enough input arguments.
0.8
0.6
0.4
0.2
sin(x)
>> plot_rapido('sin',[-2*pi 2*pi],3)
??? Error using ==> plot_rapido
Too many input arguments.
>> plot_rapido('sin',-2*pi)
??? Error using ==> plot_rapido
Numero de elementos em lim_x incorrecto
0
-0.2
-0.4
-0.6
>> plot_rapido('sin',[-2*pi 2*pi])
-0.8
-1
-8
João Sousa – Miguel Pedro Silva
-6
-4
Computação e Programação 2007 / 2008
-2
0
x
2
4
6
8
27
Grafico do sin(x)
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
28
Subfunções
Os M-files de funções podem conter mais de uma
função. A função primária é a principal, ou seja, a que
é invocada pelo nome do ficheiro M-file.
As funções adicionais no ficheiro são sub-funções, e
só são visíveis pela função primária, ou por outras subfunções no mesmo ficheiro.
Cada sub-função começa pela sua linha de definição,
estão umas a seguir às outras. A ordem das subfunções é opcional, mas a função primária deve
aparecer em primeiro lugar.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
29
Subfunções
Ficheiro estatisticas2.m
File mystats.m
estatisticas2
mystats
Função estatisticas2 é
Function
mystats
acessível
do isexterior.
accessible from outside the file.
media
mean
Funçõesmean
media
mediana só
Functions
ande median
sãoaccessible
acessíveis
dentro
are only
from
insidedo
the file.
ficheiro.
mediana
median
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
30
Exemplo: estatisticas2
function [media,mediana] = estatisticas2(u)
% ESTATISTICAS2 calcula a media e a mediana com funcoes internas
% Função ESTATISTICAS2 calcula a media e a mediana de um conjunto
% de dados utilizando sub-funcoes.
n = length(u);
media = mean(u,n);
mediana = median(u,n);
end % funcao estatisticas2
function med = mean(v,n)
% Subfuncao que calcula a media.
med = sum(v)/n;
end % funcao mean
function m = median(v,n)
% Subfuncao que calcula a mediana.
w = sort(v);
if rem(n,2) == 1
m = w((n+1)/2);
else
m = (w(n/2) + w(n/2 + 1))/2;
end
end % funcao median
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
31
Funções privadas
As funções privadas estão em sub-directorias com o
nome de private. Estas funções só são visíveis nas
funções da directoria de raíz (parent directory).
Estas directorias com o nome específico de private
podem ser criadas pelo programador, utilizando os
procedimentos habituais de criação de directorias ou
folders no computador.
Estas directorias private não devem ser colocadas
na path!
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
32
Funções internas (nested)
funcao_principal
host_function
As variáveis definidas na função
principal
são visíveis
Variables
defined
in the hostem todas as
internas.
function are funções
visible inside
any
nested functions.
func_interna_1
nested_function_1
end % func_interna_1
end % nested_function_1
func_interna_2
nested_function_2
end % func_interna_2
end % nested_function_2
end
end %% host_function
funcao_principal
João Sousa – Miguel Pedro Silva
As variáveis definidas nas funções
função
Variables
within
nestedna
internasdefined
não são
visíveis
functions are not visible in the
principal.
host function.
func_interna_1 can
pode
nested_function_1
be ser
called
from por
within
chamada
funcao_principal
host_function
or
e por func_interna_2
nested_function_2.
func_interna_2 can
pode
nested_function_2
be ser
called
from por
within
chamada
funcao_principal
host_function
or
e por func_interna_1
nested_function_1.
Computação e Programação 2007 / 2008
33
Exemplo com uma função interna
function res = testa_internas
% Nivel mais alto. Define variaveis
a = 1; b = 2; x = 0; y = 9;
% Escreve valor das variaveis antes de chamar funcao1
fprintf('Antes de chamar funcao1:\n');
fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y);
% Chama funcao interna funcao1
x = funcao1(x);
% Escreve valor das variaveis depois de chamar funcao1
fprintf('\nDepois de chamar funcao1:\n');
fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y);
%Declara funcao interna funcao1
function res = funcao1(y)
% Variaveis no inicio de funcao1
fprintf('\nNo inicio de funcao1:\n');
fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y);
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
34
Exemplo com uma função interna (2)
y = y + 5;
a = a + 1;
res = y;
% Variaveis no fim de funcao1
fprintf('\nNo fim de funcao1:\n');
fprintf('a, b, x, y = %2d %2d %2d %2d\n', a, b, x, y);
end % funcao funcao1
end % funcao testa_internas
retorna:
>> testa_internas
Antes de chamar funcao1:
a, b, x, y = 1 2 0 9
No inicio de funcao1:
a, b, x, y = 1 2 0
0
No fim de funcao1:
a, b, x, y = 2 2
5
0
Depois de chamar funcao1:
a, b, x, y = 2 2 5 9
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
35
Avaliação de funções
1. O Matlab verifica se existe uma função interna com
um dado nome. Se existir, executa-a.
2. É procurada uma subfunção com o nome dado. Se
existir, executa essa subfunção.
3. É procurada uma função com o nome dado na
directoria private. Será executada se existir.
4. É procurada uma função com o nome dado na
directoria de trabalho. Se existir, é executada.
5. Finalmente, é procurado na MATLAB path. Se
existir uma função na path, será executada.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
36