Mudanças entre as edições de "Curso Matlab aplicado ao processamento de imagens"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 234: Linha 234:
  
 
Por exemplo, arquivo ''adicao.m'':
 
Por exemplo, arquivo ''adicao.m'':
  function y = adicao(x1,x2)
+
  function y = soma1(x)
 
   
 
   
  y = x1 + x2;
+
  y = x + 1;
 
   
 
   
 
  end
 
  end
  
Este arquivo cria uma função que faz a soma de dois números. Esses números são passados como argumento da função (''x1'' e ''x2''), e o resultado da soma é retornado através da variável ''y''. O comando '''end''' ao fim do arquivo é neste caso opcional.
+
Este arquivo cria uma função que soma 1 à um número. Esse número é passado como argumento da função (''x''), e o resultado da soma é retornado através da variável ''y''. O comando '''end''' ao fim do arquivo é neste caso opcional. Após salvar as alterações no arquivo, basta chamar a função pelo seu nome e lista de argumentos:
 +
 
 +
>> soma1(2)
 +
 +
ans =
 +
 +
      3
 +
 +
>> soma1(5)
 +
 +
ans =
 +
 +
      6
 +
 +
>> soma1(1998)
 +
 +
ans =
 +
 +
        1999
 +
 
 +
 
 +
Uma função também pode receber e retornar mais de um valor. Neste caso, o seu cabeçalho fica um pouco diferente:
 +
function [soma, subt, mult, divs] = operacoes(x1, x2)
 +
 +
soma = x1 + x2;
 +
subt = x1 - x2;
 +
mult = x1 * x2;
 +
divs = x1 / x2;
 +
 +
end
 +
 
 +
Esta função recebe dois números (''x1'' e ''x2'') e realiza 4 operações. Cada operação é retornada numa variável diferente. Um detalhe importante é que o acesso aos múltiplos retornos da função se dá apenas via atribuição à variáveis específicas. Do contrário, apenas a primeira variável (no caso, a ''soma'') é retornada:
 +
 
 +
>> operacoes(1,2)
 +
 +
ans =
 +
 +
      3
 +
 +
>> [soma, subt] = operacoes(1,2)
 +
 +
soma =
 +
 +
      3
 +
 +
 +
subt =
 +
 +
    -1
 +
 +
>> [soma, subt, mult, divs] = operacoes(1,2)
 +
 +
soma =
 +
 +
      3
 +
 +
 +
subt =
 +
 +
    -1
 +
 +
 +
mult =
 +
 
 +
      2
 +
 +
 +
divs =
 +
 +
    0.5000

Edição das 14h06min de 2 de dezembro de 2014

Esta é a página do curso avançado de Matlab, elaborado pelo professor Diego da Silva de Medeiros dentro do projeto intitulado MATLAB - Software de estudos matemáticos. Este curso visa complementar o primeiro curso, de nível básico, com técnicas mais avançadas.

Classes de dados

No curso de nível básico, classes numéricas de dados foram estudados. Nesta etapa iremos conhecer outras classes existentes:

Char

Nos dados de tipo char estão compreendidos os caracteres textuais. Para indicar que uma variável é do tipo char, usamos aspas simples:

>> var1 = 'a'

var1 =

a

Da mesma forma que números, vetores de dados char podem ser criados:

>> var2 = ['a', 'b', 'c']

var2 =

abc

Repare que um vetor de caracteres é uma string, e a sua criação pode ser feita diretamente, inclusive sem os colchetes:

>> var3 = 'ola amiguinhos!'

var3 =

ola amiguinhos!


O Matlab faz uso da Tabela ASCII quando um número é concatenado à um dado da classe char:

>> var4 = ['a' 35]

var4 =

a#

Porém, é possível converter o número em um vetor char, não realizando a conversão. Para isso é usada a função num2str:

>> var5 = ['a' num2str(35)]

var5 =

a35


Cell

Muitas vezes, queremos criar listas de nomes, e a primeira opção que temos é usar strings:

>> lista1 = ['Jose Aparecido'; 'Maria Silveira'; 'Etevaldo Mario']

lista1 =

Jose Aparecido
Maria Silveira
Etevaldo Mario

Este tipo de solução, porém, funciona apenas quando todas as strings tem o mesmo número de caracteres, pois em suma, o que estamos fazendo é uma matriz de dados do tipo char:

>> size(lista1)

ans =

     3    14

Se tentarmos criar uma lista com strings de tamanhos diferentes, estamos criando uma matriz com número de elementos incompletos, sendo retornado um erro:

>> lista2 = ['mae'; 'pai'; 'filho']
Error using vertcat
Dimensions of matrices being concatenated are not consistent.


Para resolver este e outros problemas, o Matlab disponibiliza uma classe de dados adicionais, a cell. O tipo cell é como um invólucro que armazena dados de outros tipos do Matlab. Sua criação é feita usando chaves ao invés de colchetes:

>> celula1 = {5}

celula1 = 

    [5]
>> celula2 = {'b'}

celula2 = 

    'b'

>> celula3 = {[1, 2, 3, 4, 5]}

celula3 = 

    [1x5 double]

>> celula4 = {'boa noite'}

celula4 = 

    'boa noite' 

Repare que todas as variáveis criadas são do tipo cell, independente de estarem armazenando números ou letras:

>> whos celula1 celula2 celula3 celula4
  Name         Size            Bytes  Class    Attributes

  celula1      1x1               120  cell               
  celula2      1x1               114  cell               
  celula3      1x1               152  cell               
  celula4      1x1               130  cell 

Além disso, todas as variáveis criadas tem o mesmo tamanho, 1x1. Porém, assim como qualquer outro tipo de dado do Matlab, vetores ou matrizes podem ser criados.

>> celula5 = {1, 2, 3, 4}

celula5 = 

    [1]    [2]    [3]    [4]

>> celula6 = {'g'; 'y'; 'A'}

celula6 = 

    'g'
    'y'
    'A'

>> celula7 = {[1 2], [3; 4]}

celula7 = 

    [1x2 double]    [2x1 double]

>> celula8 = {'oi', 'amigo'}

celula8 = 

    'oi'    'amigo'
>> whos celula5 celula6 celula7 celula8
  Name         Size            Bytes  Class    Attributes

  celula5      1x4               480  cell               
  celula6      3x1               342  cell               
  celula7      1x2               256  cell               
  celula8      1x2               238  cell

Um dado da classe cell pode agrupar dados de diferentes tamanhos e classes:

>> celula9 = {'Joao', 13, 'O+', [140, 35]; 'Maria', 15, 'A-', [135, 29]}

celula9 = 

    'Joao'     [13]    'O+'    [1x2 double]
    'Maria'    [15]    'A-'    [1x2 double]

Structs

As cells permitem criar listas com tipos diferentes de dados e com diferentes tamanhos. Porém, é algumas vezes necessária a criação de listas mais elaboradas. Para isso, structs podem ser utilizadas. Para criar um dado do tipo struct, pode-se usar a função struct:

>> s1 = struct('Nome',[],'Idade',[],'Tipo',[],'Altura',[],'Peso',[])

s1 = 

      Nome: []
     Idade: []
      Tipo: []
    Altura: []
      Peso: []

Neste caso, uma struct com 5 campos foi criada, porém, nenhum valor foi atribuído à nenhum dos campos. Para adicionar valores, o operador ponto é utilizado:

>> s1.Nome = 'Joao'

s1 = 

      Nome: 'Joao'
     Idade: []
      Tipo: []
    Altura: []
      Peso: []

>> s1.Altura = 140

s1 = 

      Nome: 'Joao'
     Idade: []
      Tipo: []
    Altura: 140
      Peso: []

É possível atribuir valores já na criação da struct, bastando incluir no lugar dos colchetes. Além da função struct é possível criar variáveis desta classe dinamicamente, através do operador ponto:

>> s2.Marca = 'Volkswagen'

s2 = 

    Marca: 'Volkswagen'

>> s2.Modelo = 'Fusca'

s2 = 

     Marca: 'Volkswagen'
    Modelo: 'Fusca'

>> s2.Ano = 1962

s2 = 

     Marca: 'Volkswagen'
    Modelo: 'Fusca'
       Ano: 1962

A criação de uma lista é feita a partir de um vetor de structs:

>> s2(2).Marca = 'FIAT';
>> s2(2).Modelo = '147';
>> s2(2).Ano = 1980

s2 = 

1x2 struct array with fields:
    Marca
    Modelo
    Ano

Funções

Assim como a maioria das linguagens de programação o Matlab também permite a criação de funções. Com elas, evitamos a repetição de códigos numa simulação, contribuindo para a legibilidade e facilitando a alteração de funcionalidade. Para criar uma função criamos um arquivo com o nome pretendido e incluímos um cabeçalho que indica as suas características.

Por exemplo, arquivo adicao.m:

function y = soma1(x)

y = x + 1;

end

Este arquivo cria uma função que soma 1 à um número. Esse número é passado como argumento da função (x), e o resultado da soma é retornado através da variável y. O comando end ao fim do arquivo é neste caso opcional. Após salvar as alterações no arquivo, basta chamar a função pelo seu nome e lista de argumentos:

>> soma1(2)

ans =

     3

>> soma1(5)

ans =

     6

>> soma1(1998)

ans =

        1999


Uma função também pode receber e retornar mais de um valor. Neste caso, o seu cabeçalho fica um pouco diferente:

function [soma, subt, mult, divs] = operacoes(x1, x2)

soma = x1 + x2;
subt = x1 - x2;
mult = x1 * x2;
divs = x1 / x2;

end

Esta função recebe dois números (x1 e x2) e realiza 4 operações. Cada operação é retornada numa variável diferente. Um detalhe importante é que o acesso aos múltiplos retornos da função se dá apenas via atribuição à variáveis específicas. Do contrário, apenas a primeira variável (no caso, a soma) é retornada:

>> operacoes(1,2)

ans =

     3

>> [soma, subt] = operacoes(1,2)

soma =

     3


subt =

    -1

>> [soma, subt, mult, divs] = operacoes(1,2)

soma =

     3


subt =

    -1


mult =
     2


divs =

   0.5000