Ponta Grossa
MatLab – Programação
Taysa Millena Banik
taysabanik@[Link]
Max Mauro Santos Dias
maxsantos@[Link]
Vinicius Antunes
[Link]@[Link]
Sumário
1. Introdução
2. Classes Sintáticas e Classe de Variáveis
3. Editor de Programas - Edit
4. Elementos de Programação
5. Estatística de Execução de Programa
6. Boas Práticas de Programação
Introdução
• Apresentação dos utilitários disponíveis no “edit”;
• Principais estruturas de controle de fluxo de algoritmo.
Linguagem e Bibliotecas
MATLAB
+
Programação
(Seus M-Files)
Aplicações
(2006 Toyota Endo concept car, built
with MATLAB)
Classes Sintáticas e Classes de Variáveis
• Definições das palavras que compõem a linguagem de programação do
Matlab:
• Classes Sintáticas;
• Classes de Variáveis.
Classes Sintáticas
• Palavras reservadas: palavras que fazem parte do vocabulário de
instruções da linguagem de programação e não podem ser usadas
como nome de variáveis. Por exemplo: function, if, then, else, while,
for;
• Identificadores: palavras utilizadas como nomes de função ou
variável;
• Operadores: sinais de operadores, por exemplo: =,+,-,*,/,[],{};
• Números: números e símbolos (Inf, NaN) e constantes (eps,pi);
• Cadeia de caracteres: textos codificados entre ‘ ‘;
• Texto de comentário: texto procedidos pelo sinal %;
• Texto de comentário delimitador de seção de código: texto precedido
pelo %%.
Classes de Variáveis
• Duas grandes classes: numérica e não numérica;
Classe Numérica Descrição Tamanho em
Bytes
double Precisão dupla 8
• Os nomes das classes
também são nomes de
single Precisão simples 4
funções de conversão.
int8 Inteiro 8bits com 1
sinal
uint8 Inteiro 8bits sem 1
sinal
Int16 Inteiro 16bits com 2
sinal
uint16 Inteiro 16bits sem 2
sinal
int32 Inteiro 32bits com 4
sinal
uint32 Inteiro 32bits sem 4
sinal
int64 Inteiro 64bits com 8
sinal
uint64 Inteiro 64bits sem 8
sinal
Classes de Variáveis
Classe NÃO Numérica Descrição Tamanho em Bytes
Logical Lógica(0 ou 1)/(falso ou 8
verdadeiro)
Char Alfanumérica 1
Cell Cell array Variável
Struct Struct Variável
Function_handle Identificador de função 16
• Para saber a classe de uma variável – função class:
Classe de Variáveis – Funções Lógicas de Informação
Sintaxe Típica Retorna VERDADEIRO se a variável
L = isa(var, classe) For da classe
L = iscell (var) For cell array
L = isempty (var) Tiver conteúdo vazio
L = isfloat (var) For numérica com ponto flutuante
(double ou single)
L = isglobal (var) For variável global
L = isinteger (var) For número inteiro (int ou uint)
L = iskeyword (var) For palavra reservada da linguagem
Matlab
L = islogical (var) For variável lógica
L = isnumeric (var) For classe numérica
L = ispermanent (var) For variável permanente
L = isreal (var) For número real
L = isstruct (var) For struct
L = isvarname (var) Contiver um texto que pode ser nome de
variável
Editor de Programas : Edit
• Acionar:
• Aba Home – New Script/New/Open;
• Command History – Creat Script;
• Digitando edit + nome do arquivo (abrir um programa).
Obs.: o editor pode carregar vários arquivos, simultaneamente, abrindo uma aba
para cada um deles.
Apoio à Codificação
O Edit provê os seguintes recursos de apoio à codificação:
• Numeração de linha;
• Continuidade de instrução na próxima linha;
• Exibição de texto com cor diferente de acordo com sua classe sintática;
• Verificação de balanceamento de parênteses;
• Indicação de presença de erro de sintaxe;
• Explicação do erro e sugestão de correção.
Identação Automática ou;
Smart-Indenting – Identação em
trechos já escrito.
Execução de Código por Seção: Cell Mode
• No Edit, o conjunto de caracteres ‘%%’ divide o código de programação em seções
de código (code section) ou células de código (cell code);
• Essas divisões permitem que o programa seja executado célula a célula. A
execução das células de código é controlada por meio dos ícones disponíveis na
aba [Editor].
• [Run and Advance]: aciona a execução da célula de código corrente e passa
para a próxima;
• [Run Section]: aciona a execução da célula de código corrente e não passa
para a próxima;
• [Advance]: aciona a passagem para a próxima célula;
• [Run]: aciona a execução do código completo.
Depuração de Programa: Debug Mode
• O processo de debug do programa é definido pela marcação de pontos de
interrupção de execução (breakpoints) ao longo do código;
• Nos breakpoints é possível inspecionar o conteúdo de variáveis, conferir seus
valores e, desta forma, descobrir e solucionar erros de programação.
• Eles são definidos quando indicados na margem direita do editor, na linha de
código desejada. A linha com breakpoint é marcada com um círculo vermelho;
• Para desmarcar breakpoints, basta clicar no círculo vermelho;
• Depois de configurar os breakpoints no editor, a próxima execução do programa
ou chamada da função será executada em debug mode, isto é, em modo de
depuração.
Obs.: o sinal ‘k>>’ indica que a função foi chamada em modo de depuração e que a
execução foi suspensa no 1° breakpoint.
Elementos de Programação
• Programas Matlab (m-files):
• Script-file: armazena uma sequência de comandos Matlab que serve para
automatizar processos repetitivos. Não possuem parâmetros e acessam
diretamente o Workspace do Matlab.
• Function/Program file: armazena uma ou mais funções do Matlab, que
aceitam parâmetros de entrada e saída e possuem escopo de variável
próprio, ou seja, trabalham com variáveis locais que ocupam área de
memória separada e não acessam o Workspace do Matlab.
Definição de Função
Sintaxe:
function [Saida1,...,SaidaN] = Funcao (Entrada1,..., EntradaM)
<Expr 1>
...
<Expr P>
Com relação ao fornecimento de parâmetros de saída na chamada da função:
• Se nenhum parâmetro de saída for solicitado, a função retorna apenas o primeiro
parâmetro;
• Se forem solicitados menos parâmetros de saída do que o declarado, a função
retorna apenas os parâmetros solicitados;
• O sinal ‘~’ é utilizado para indicar a posição de um parâmetro de saída cujo
conteúdo não será necessário;
• Se forem solicitados mais parâmetros de saída do que o declarado, a função
retorna erro.
Definição de Função
• 4 formas diferentes
de chamada da
função max, que
retorna dois
parâmetros de
saída.
Definição de Função - Variáveis Locais
• São utilizadas dentro de funções e ficam armazenadas em áreas de memórias
próprias, independentes do Workspace do Matlab;
• Não são reconhecidas fora do escopo das funções nas quais foram definidas, e
variáveis do Workspace não são reconhecidas dentro de funções;
• Podem ser do tipo ‘permanente’ (persistente variable), isto é, que mantém seu
conteúdo da execução de uma função para outra, dentro de uma mesma sessão
de execução do Matlab. Uma variável ‘permanente’ deve ser explicitamente
declarada como ‘persistente’ no corpo da função.
function Saida = Funcao (Entrada)
Persistent Var_p
Definição de Função - Variáveis Globais
• Devem ser declaradas como global tanto na linha de comando do Matlab
quanto dentro do corpo da função;
• Desta forma, conseguem ser reconhecidas dentro e fora do escopo das
funções nas quais foram definidas.
Function Saida = Funcao (Entrada)
Global Var_g
Escopo de Funções
• Função Primária ou Principal: contém o código da rotina principal e deve ter o mesmo
nome do arquivo no qual está codificada;
• Função Auxiliar (subfunction): um arquivo de programa pode conter várias funções
desde que apenas uma seja a principal (a função que tiver o mesmo nome que o
arquivo) e as demais sejam auxiliares. As palavras reservadas function e end indicam,
respectivamente, início e final de definição de funções auxiliares. Cada função auxiliar
possui seu próprio Workspace. Seu escopo é o próprio arquivo, ou seja, ela só é
reconhecida por outras funções que estiverem no mesmo arquivo;
• Função aninhada (nested function): uma função pode conter várias funções
aninhadas.
• Função particular (private function): uma função particular é uma função auxiliar
armazenada em um arquivo diferente da rotina principal. Os arquivos de funções
particulares devem ser armazenados em um subdiretório denominado ‘private’. Esse
tipo e função é utilizado no caso em que várias rotinas principais utilizam uma
mesma função particular.
Função Usada como Parâmetro de Entrada
• Funções solvers que resolvem numericamente equações diferenciais – o nome
da função deve ser passado entre ‘ ‘ como parâmetro de entrada da função
solver;
• Objeto identificador de função – function handle
sintaxe: handle = @<nome da funcao>
@(<lista de argumentos>)<nome da funcao>(lista de argumentos)
• Funções que calculam numericamente integral de funções e funções de
otimização utilizam handle function
A integral da função seno entre
[0, π].
Função Usada como Parâmetro de Entrada
• O sinal ‘@’ também pode ser usado para definir funções anônimas (anonymous
functions) – funções sem nome, compostas apenas por uma linha de comando;
sintaxe: @(<lista de comandos>) <comando>
A função 𝑥𝑥 2 como anonymous function e o
cálculo da integral dessa função entre
[0,1]:
Expressões Lógicas
• O Matlab possui características de linguagem de programação estruturada e
emprega expressões lógicas nos testes utilizados pelas estruturas de seleção e
repetição;
• Os resultados de testes lógicos são armazenados em logical arrays – vetores de
bits (0 ou 1):
• 0 (zero) ou nil (nulo, vazio) indica condição falsa (false);
• 1 (um) ou diferente de 0 (zero) indica condição verdadeira (true).
Expressões Lógicas
Teste de tipo Matriz:
Sintaxe Típica Teste Retorna Verdadeiro Se:
Isempty (M) A matriz M é vazia
Isnumeric (M) A matriz M é numérica
Issparse (M) A matriz M é esparsa
Teste de tipo de Dado:
Sintaxe Típica Teste Retorna Verdadeiro Se:
Iscell(A) A é célula
Iscellstr (A) A é célula de cadeia de caracteres
Isfield (S,F) F é campo da estrutura S
Isstruct (S) S é estrutura
Expressões Lógicas
Teste de tipo Numérico:
Sintaxe Típica Teste Retorna Verdadeiro Se:
Isfinite (N) N é finito
Isinf (N) N é infinito
Isnan (N) N é NaN
Isreal (N) N é número real
Estruturas de Seleção
• As estruturas de seleção usam expressões lógicas para determinar o trecho de
código a ser executado;
Sintaxe Típica Descrição
If<[Link]> Se a expressão lógica <[Link]> for
<código1> verdadeira, executa o trecho de código
else <código1>; caso contrário, executa
<código2> <código2>.
end
If <[Link].1> Implementa encadeamento de
<codigo1> estruturas de if, else
elseif <[Link].2>
<codigo2>
else
<codigo3>
end
Switch <valor_teste> Executa trecho de código de acordo com
Case<expr_case1> o valor contido em uma variável de teste
<código1>
Case<expr_case2>
<codigo2>
....
Estruturas de Seleção
• Estrutura if/else
Estrutura de Seleção
• Estrutura if/elseif
Estruturas de Seleção
• Estrutura com switch
Estruturas de Repetição
• As estruturas de repetição utilizam expressões lógicas como critério de repetição de
execução de um determinado trecho de código.
Sintaxe Típica Descrição
While <[Link]> Executa o trecho do código <código>
<código> enquanto a expressão lógica <[Link]>
End for verdadeira
For V=<inic>:<incr>:<fim> Para cada valor da variável V (de <inic>
<codigo> até <fim>, com incremento <incr>),
end executa o trecho de código <código>.
O próximo exemplo trará
uma função que retorna
uma matriz triangular
inferior contendo o
desenvolvimento do
Triângulo de Pascal:
Estruturas de Repetição
Programação
Execução
Estatística de Execução de Programa
• O comando profile permite extrair relatórios com informações estatísticas
detalhadas sobre os tempos de execução de programas:
O relatório exibe as operações
em ordem decrescente de
tempo de execução.
Boas Práticas de Programação
• Escolher nomes significativos para variáveis e funções;
• Usar Identação para destacar o nível de aninhamento das estruturas de
programação;
• Iniciar todo arquivo de programa com texto de comentário contendo a
descrição e identificação de seu conteúdo;
• Incluir comentários explicativos ao longo do código.
Recuperação de Erro
• Um bom programa deve ter alta tolerância a falhas e capacidade de
recuperação de erros;
• O Matlab possui uma estrutura de dados específica: MWException
Campo Descrição
identifier Código de identificação interna do erro
message Mensagem de erro
cause Causa específica do erro
stack Subestrutura composta por 3 campos:
File: nome do arquivo onde o erro
ocorreu
Name: nome da função onde o erro
ocorreu
Line: número da linha onde o erro
ocorreu
• A função lasterror retorna uma estrutura MWException com a descrição
do último erro ocorrido.
Recuperação do Erro - mecanismos
• Programação try/catch:
Sintaxe Típica Descrição
Try Em caso de ocorrência de erro na
<código1> execução do trecho <código1>:
Catch Var 1. A execução é suspensa;
<código2> 2. A variável Var recebe uma estrutura
end de dados do tipo MWException
contendo a descrição do erro;
3. O trecho <código2> é executado.
Recuperação de Erro – try/catch
Função
Execução Incorreta
Execução Correta
Consulta ao Ambiente Operacional
• O MatLab possui funções que acessam informações de sistema que podem ser
utilizadas para criar programas que funcionem em ambientes operacionais
diferentes.
Sintaxe Típica Ação/Retorno
tp =computer Tipo de computador
• ‘PCWIN’: plataforma MS-Windows
32 bit
• ‘PCWIN64’: plataforma MS-Windows
64 bits
• ‘GLNXA64’:plataforma Linux 64 bits
• ‘MACI64’: plataforma Apple
Macintosh 64 bits
txt = filesep Separador de nome de arquivo da
plataforma
txt = getenv (‘var’) Variável de ambiente ‘var’. Caso a
variável não exista, a função retorna
cadeia de caracteres vazia ‘’.
Setenv (‘var’, txt) Configura variável de ambiente ‘var’,
com valor txt.
Consulta ao Ambiente Operacional
• No caso de programas que fazem uso de arquivos temporários, uma prática
comum é criá-los no diretório temporário do sistema. Neste caso, as funções
getenv e filesep podem ser utilizadas para compor o nome do arquivo.
Exemplo:
Prealocação de Memória
• No Matlab, vetores e matrizes podem ser utilizados sem predefinição de
tamanho:
Isso é duplamente ineficiente
porque aumenta o tempo de
processamento e fragmenta a
memória.
Instrução Operação de Memória
a(1) = 10; Busca 8 bytes contíguos livres
a(2) = 20; Inutiliza os 8 bytes anteriores e busca 16
novos bytes contíguos livres.
a(5) = 50 Inutiliza os 16 bytes anteriores e busca
40 novos.
Prealocação de Memória
• No caso de vetores e matrizes grandes é recomendável predefinir suas dimensões,
o que equivale prealocar a quantidade de memória que será utilizada;
• A função triangulo_pascal é um exemplo de Prealocação, onde a quantidade de
memória necessária para armazenar a matriz a é prealocada pela função eye, que
cria uma matriz identidade n x n.
Mesma função sem Prealocação...
Prealocação de Memória
• Os comandos tic/toc podem ser usado para comparar os tempos de execução de
cada função e comprovar a melhoria ganha com a adoção de prealocação de
memória.
Sintaxe Típica Ação/Retorno
Tic Inicia a cronometragem
toc Encerra a cronometragem
Obs.: quanto maior o tamanho da matriz, mais acentuada é a diferença entre os
tempos de execução.
Barra de Tempo de Execução
• Função waitbar – exibe uma caixa de diálogo com barra de tempo de
execução.
Sintaxe Típica Ação/Retorno
h = waitbar(0, Msg) Cria a caixa de diálogo com barra de
tempo e retorna o identificador da caixa.
• Msg: mensagem
Waitbar(F,h) Atualiza a barra de tempo:
• F: fração de execução
• h:Identificador da caixa
Textos de Comentário e Publicação de Código
• ‘%%’ – publish-
Publicação de código
Proteção de Código
• O comando pcode cria uma versão codificada de programas Matlab para
proteger códigos-fonte. Extensão .p.
Gerenciamento de Arquivos de Programas
Com o auxílio de alguns utilitários, que produzem relatórios, é possível gerenciar
sistemas compostos por vários arquivos de programa.
• Code Analyzer Report: gera relatório de verificação de sintaxe de todos os arquivos
de programa contidos no diretório corrente. A análise é semelhante à realizada,
individualmente, para cada arquivo dentro do edit.
• TODO/FIXME Report: Esse utilitário supõe que os arquivos de programa estão em
processo de desenvolvimento e que, por este motivo, contêm o texto:
• TODO: para indicar algo que deve ser feito
• FIXME: para indicar algo que deve ser corrigido
• Help Report: gera relatório com o conteúdo do texto help de todos os arquivos
contidos no diretório. É útil para uniformizar os textos de help dos programas que
fazem parte do sistema.
• Contents Report: gera relatório com primeiro parágrafo do texto de help de todos
os arquivos contidos no diretório. É útil para criar um índice de conteúdo do
diretório.
Gerenciamento de Arquivos de Programa
• Dependency Report: gera relatório de dependência de funções (quem chama
quem, quem é chamado por quem) para todos os arquivos contidos no
diretório corrente. É muito útil para composição de documentação de sistema.
• Coverage Report: gera relatório sobre a porcentagem de código executado na
última contagem de tempo contabilizada pelo comando profile.
• Compare: gera relatório de comparação entre códigos contidos em dois
arquivos de programa. É útil para manutenção de versões de programa.
Próxima Aula:
Leitura e Gravação de Arquivos
Ponta Grossa
Obrigada
Taysa Millena Banik
taysabanik@[Link]