Skip to content

MATLAB Folha de referência

Ambiente de computação numérica para engenharia e ciência.

01

Matrizes e Operações Básicas

Criando Matrizes e Vetores

MATLAB (MATrix LABoratory) trata todas as variáveis como matrizes. Vetores são matrizes 1xN ou Nx1. Use espaços ou vírgulas para separar elementos em uma linha, ponto e vírgula para novas linhas. zeros, ones, eye, rand e magic criam matrizes de teste comuns. O operador dois-pontos start:step:stop gera intervalos (passo padrão 1). linspace(a, b, n) cria n pontos igualmente espaçados — ideal para eixos de gráficos.

matlab
% row vector
v = [1 2 3 4 5];

% column vector (semicolon = new row)
c = [1; 2; 3];

% 3x3 matrix
A = [1 2 3; 4 5 6; 7 8 9];

% special matrices
Z = zeros(3);          % 3x3 zeros
O = ones(2, 4);        % 2x4 ones
I = eye(3);            % 3x3 identity
R = rand(2, 3);        % 2x3 uniform random
N = randn(4);          % 4x4 normal random
M = magic(4);          % 4x4 magic square
D = diag([1 2 3]);     % diagonal matrix

% linear spacing
l = linspace(0, 1, 5); % [0 0.25 0.5 0.75 1]
r = 0:0.5:2;           % [0 0.5 1 1.5 2]

Indexação e Fatiamento de Matrizes

MATLAB é indexado em 1 (não em 0). Os dois-pontos : significam 'todos' — A(:,2) é a segunda coluna inteira. A(1:3, :) seleciona as linhas 1-3. 'end' refere-se ao último índice naquela dimensão. Indexação lógica (A(A > 5)) é extremamente poderosa — ela extrai ou modifica elementos que correspondem a uma condição. find retorna os índices de elementos não nulos/verdadeiros, e com duas saídas fornece linha e coluna separadamente.

matlab
A = magic(4);          % 4x4 magic square

% single element (1-indexed!)
A(2, 3)                % row 2, col 3

% entire row or column
A(1, :)                % first row (all columns)
A(:, 2)                % second column (all rows)

% submatrix
A(1:2, 2:4)            % rows 1-2, cols 2-4

% linear indexing (column-major)
A(5)                   % 5th element counting down columns

% end keyword
A(end, :)              % last row
A(:, end-1)            % second-to-last column

% logical indexing
A(A > 10)              % all elements > 10 (as vector)
A(A > 10) = 0;         % set large elements to 0

% find indices
[r, c] = find(A == 16) % row and col of value 16

Aritmética de Matrizes

O ponto antes de um operador (.*) torna a operação elemento a elemento em vez de matriz — esta é a fonte nº 1 de bugs de iniciantes. A*B é multiplicação de matrizes; A.*B multiplica elementos correspondentes. O operador barra invertida (\) resolve sistemas lineares de forma eficiente e precisa (decomposição LU) — sempre prefira x = A\b a inv(A)*b. O apóstrofo (') transpõe; para matrizes complexas use .' para transposição não conjugada.

matlab
A = [1 2; 3 4];
B = [5 6; 7 8];

% matrix operations
C = A + B;             % addition
D = A - B;             % subtraction
E = A * B;             % matrix multiplication
F = A';                % transpose
G = A^2;               % matrix power (A * A)

% element-wise operations (use the dot!)
H = A .* B;            % element-wise multiply
I = A ./ B;            % element-wise divide
J = A .^ 2;            % element-wise power
K = 2 * A;             % scalar multiply

% matrix functions
det(A)                 % determinant
inv(A)                 % inverse
pinv(A)                % pseudo-inverse
rank(A)                % rank
trace(A)               % trace (sum of diagonal)

% solving linear systems Ax = b
b = [5; 11];
x = A \ b;              % left division: solves A*x = b
x = inv(A) * b;        % equivalent but slower

Manipulação de Matrizes

A concatenação com [A B] (espaços) junta horizontalmente; [A; B] (ponto e vírgula) junta verticalmente — espelhando a sintaxe de criação de linhas. reshape preenche em ordem coluna-major (para baixo, depois para o lado). flipud/fliplr/rot90 reorientam matrizes. repmat cria mosaicos de uma matriz em um padrão de grade. Definir uma linha ou coluna como [] a exclui. size retorna dimensões, length retorna a maior dimensão, numel retorna a contagem total de elementos.

matlab
A = [1 2; 3 4];
B = [5 6; 7 8];

% concatenation
C = [A B];             % horizontal: [1 2 5 6; 3 4 7 8]
D = [A; B];            % vertical: 4x4

% reshape
E = reshape(1:12, 3, 4);  % 3x4 matrix from 1..12

% flip and rotate
F = flipud(A);         % flip up-down
G = fliplr(A);         % flip left-right
H = rot90(A);          % rotate 90 degrees

% repmat (tile)
I = repmat([1 2], 2, 3);  % repeat [1 2] in a 2x3 grid

% size and length
[m, n] = size(A);      % m=2, n=2
len = length(A);       % max dimension = 2
num = numel(A);        % total elements = 4

% remove rows/cols
A(2, :) = [];          % delete row 2
A(:, 1) = [];          % delete column 1

Funções Elemento a Elemento e Vetorização

A força do MATLAB é a vetorização — aplicar operações a matrizes inteiras de uma vez, o que executa em C/Fortran otimizado internamente. sin, exp, sqrt etc. operam elemento a elemento automaticamente. sum/prod/max/min funcionam por coluna por padrão (dimensão 1); passe a dimensão 2 para operar por linha. A(:) achata uma matriz em um vetor. Sempre prefira operações vetorizadas a loops for por desempenho — elas podem ser 10-100x mais rápidas.

matlab
% math functions operate element-wise
x = 0:0.1:2*pi;
y = sin(x);            % sine of each element
z = exp(x);            % exponential
w = sqrt(x);           % square root

% rounding
round(3.7)             % 4
floor(3.7)             % 3
ceil(3.2)              % 4
fix(-3.7)              % -3 (toward zero)

% sums and products along dimensions
A = magic(3);
sum(A)                 % sum of each column (row vector)
sum(A, 2)              % sum of each row (column vector)
sum(A(:))              % sum of ALL elements
prod(A)                % product of each column
cumsum(A)              % cumulative sum

% min, max, sort
[v, i] = max(A(:))     % max value and its index
sort(A, 'descend')     % sort each column descending

% AVOID loops — vectorize!
% BAD: for i=1:1000, y(i)=sin(i); end
% GOOD:
i = 1:1000;
y = sin(i);            % fast, vectorized
02

Controle de Fluxo e Lógica

If / Elseif / Else

MATLAB usa if/elseif/else/end (nota: elseif é uma palavra só). Operadores lógicos: && (E escalar), || (OU escalar), & (E elemento a elemento), | (OU elemento a elemento), ~ (NÃO, não !). Para comparação de strings use strcmp/strcmpi (não diferencia maiúsculas de minúsculas) — o operador == só funciona para arrays de caracteres do mesmo tamanho. Sempre finalize blocos com 'end'.

matlab
score = 85;

if score >= 90
    grade = 'A';
elseif score >= 80
    grade = 'B';
elseif score >= 70
    grade = 'C';
else
    grade = 'F';
end

disp(grade);  % B

% logical operators: && (and), || (or), ~ (not)
if x > 0 && x < 10
    disp('in range');
end

% compare strings with strcmp
if strcmp(name, 'Alice')
    disp('hi Alice');
end

Loops For e While

for itera sobre cada coluna da expressão fornecida (para vetores, cada elemento). while executa enquanto a condição for verdadeira. SEMPRE pré-aloque arrays antes dos loops (result = zeros(1,N)) — crescer um array em um loop força realocação a cada iteração e é extremamente lento. O operador dois-pontos 1:5 cria [1 2 3 4 5]. fprintf imprime saída formatada (como o printf do C).

matlab
% for loop over a range
for i = 1:5
    fprintf('i = %d\n', i);
end

% iterate over a vector
v = [10 20 30];
for val = v
    disp(val);
end

% nested loop over a matrix
A = zeros(3, 3);
for r = 1:3
    for c = 1:3
        A(r, c) = r * c;
    end
end

% while loop
n = 10;
while n > 1
    n = n / 2;
    fprintf('%.2f\n', n);
end

% preallocate for speed (IMPORTANT!)
result = zeros(1, 1000);
for i = 1:1000
    result(i) = i^2;
end

Switch e Break/Continue

switch compara um valor com rótulos case — sem necessidade de break (ao contrário de C/Java). case pode receber um cell array para múltiplos valores. otherwise é o padrão. break sai do loop mais interno; continue pula para a próxima iteração. try/catch trata erros de forma elegante; ME é um objeto MException com .message e .identifier. MATLAB não tem operador ternário — use if/else ou funções inline.

matlab
% switch statement
method = 'linear';
switch method
    case 'linear'
        disp('using linear');
    case 'cubic'
        disp('using cubic');
    case {'nearest', 'spline'}
        disp('using nearest or spline');
    otherwise
        disp('unknown method');
end

% break and continue
for i = 1:10
    if i == 5
        break        % exit the loop entirely
    end
    if mod(i, 2) == 0
        continue     % skip to next iteration
    end
    disp(i);         % prints 1 3
end

% try-catch for error handling
try
    x = 1 / 0;       % may error
catch ME
    fprintf('Error: %s\n', ME.message);
end

Operações Lógicas e Indexação

A indexação lógica é o recurso matador do MATLAB — A(condição) seleciona elementos onde o array lógico é verdadeiro. ~= é 'diferente de' (não !=). & e | são elemento a elemento; && e || são de curto-circuito (apenas escalares, preferidos em condições if). find retorna índices lineares de valores verdadeiros. any/all testam se algum/todos os elementos são verdadeiros, opcionalmente ao longo de uma dimensão. A família is* testa tipos e valores especiais (NaN, Inf).

matlab
A = [1 2 3 4 5 6 7 8 9 10];

% comparison operators
A > 5                  % logical array
A == 5
A ~= 5                 % not equal (NOT !=)
A >= 3 & A <= 7        % element-wise AND
A < 3 | A > 7          % element-wise OR

% logical indexing (powerful!)
A(A > 5)               % [6 7 8 9 10]
A(A > 5) = 0;          % set elements > 5 to 0
A(mod(A, 2) == 0)      % even numbers

% find indices
idx = find(A > 5);     % indices of elements > 5
[r, c] = find(A > 5);  % row and col (for matrices)

% any and all
any(A > 5)             % true if ANY element > 5
all(A > 0)             % true if ALL elements > 0
any(A > 5, 2)          % per row

% is functions
isnan(x); isinf(x); isfinite(x);
isnumeric(x); ischar(x); iscell(x);

Strings e Formatação

MATLAB tem dois tipos de string: char arrays ('texto', legado) e strings escalares ("texto", R2017+). Strings escalares são mais flexíveis para manipulação. sprintf retorna uma string formatada; fprintf imprime no console ou arquivo. Especificadores de formato comuns: %s (string), %d (inteiro), %f (float), %.2f (2 casas decimais), %e (científico). strsplit/strjoin lidam com listas delimitadas. num2str/mat2str convertem números em strings.

matlab
% string creation
s1 = 'Hello';          % char array
s2 = "World";          % string scalar (R2017+)

% concatenation
greeting = [s1 ', ' s2 '!'];  % char array concat
full = s1 + " " + s2;          % string concat

% formatting
name = 'Alice';
age = 30;
fprintf('Name: %s, Age: %d\n', name, age);
str = sprintf('Pi is %.2f', pi);  % returns string

% common string functions
upper('hello')         % HELLO
lower('WORLD')         % world
strlength("hello")     % 5 (string)
length('hello')        % 5 (char array)
strcmp('a', 'a')       % true
strfind('hello', 'll') % 3 (index)
strrep('cat', 'c', 'b') % bat
strsplit('a,b,c', ',') % {'a','b','c'}
strjoin({'a','b'}, '-') % a-b
num2str(42)             % '42'
03

Funções e Scripts

Definição de Funções

Funções devem estar em um arquivo com o mesmo nome (add.m para a função add), ou no final de um arquivo de script. A primeira linha é a declaração da função. Funções têm seu próprio workspace (separado do workspace base). nargin/nargout permitem lidar com argumentos opcionais — nargin conta as entradas reais. Múltiplas saídas são capturadas com [a, b] = func(). Se você chamar com menos saídas, as extras são descartadas.

matlab
% function in a file named 'add.m'
function result = add(a, b)
    % ADD returns the sum of a and b
    result = a + b;
end

% with multiple inputs and outputs
function [mn, mx, avg] = stats(v)
    mn = min(v);
    mx = max(v);
    avg = mean(v);
end

% calling functions
s = add(3, 4);              % 7
[lo, hi, mu] = stats([1 2 3 4 5]);

% capture only first output
minimum = stats([1 2 3]);   % gets mn only

% nargin and nargout (number of args)
function y = power(x, n)
    if nargin < 2
        n = 2;              % default value
    end
    y = x .^ n;
end

Funções Anônimas e Inline

Funções anônimas (@(args) expr) são funções rápidas de uma linha definidas inline — perfeitas para passar para solvers (fzero, integral, ode45) sem criar arquivos. Elas capturam variáveis do workspace no momento da criação. Function handles (@sin) permitem passar funções embutidas ou do usuário como argumentos. Isso é essencial para computação numérica: integral(@(x) f(x), a, b) integra qualquer função que você definir.

matlab
% anonymous function (one-liner, no file needed)
square = @(x) x .^ 2;
square(5)              % 25
square([1 2 3])        % [1 4 9]

% with multiple inputs
add = @(a, b) a + b;
add(3, 4)              % 7

% capture variables from workspace
c = 10;
addc = @(x) x + c;
addc(5)                % 15

% function handle to built-in
f = @sin;
f(pi/2)                % 1

% pass functions as arguments
result = integral(@(x) x.^2, 0, 1);  % integrate x^2 from 0 to 1
result = fzero(@(x) x^2 - 2, 1);     % find root near 1

% array of function handles
funs = {@sin, @cos, @tan};
funs{1}(0)             % 0

Scripts e Live Scripts

Scripts são sequências de comandos que executam no workspace base (diferente de funções, que têm workspaces isolados). O marcador %% cria 'células' (seções) que você pode executar independentemente com Ctrl+Enter — ótimo para desenvolvimento incremental. Live Scripts (.mlx) são como notebooks Jupyter: combinam código, texto formatado, equações e gráficos inline em um documento interativo. Prefira funções a scripts para código reutilizável.

matlab
% A script is just a sequence of commands in a .m file
% It shares the base workspace

% script: analyze_data.m
data = load('data.mat');
cleaned = data.values(data.values > 0);
mean_val = mean(cleaned);
fprintf('Mean: %.2f\n', mean_val);
plot(cleaned);
title('Cleaned Data');

% sections (cells) with %%
%% Initialize
x = linspace(0, 2*pi, 100);

%% Plot
plot(x, sin(x));

%% Analyze
disp(mean(sin(x)));

% Run a section: Ctrl+Enter (in editor)
% Live Scripts (.mlx): rich text, inline plots, equations

Funções Aninhadas e Locais

Scripts podem conter funções locais no final do arquivo (desde R2016b) — elas só são visíveis dentro daquele arquivo. Funções aninhadas (definidas dentro de outra função) compartilham o workspace do pai, então podem ler e modificar suas variáveis — útil para callbacks e acumuladores, mas pode tornar o código mais difícil de seguir. Funções locais em arquivos de função são auxiliares visíveis apenas dentro daquele arquivo. Use funções locais para manter os scripts organizados sem criar muitos arquivos.

matlab
% local functions in a script (must be at the end)
% main_script.m
x = 1:10;
y = process(x);
disp(y);

function r = process(v)
    r = normalize(scale(v));  % calls another local function
end

function s = scale(v)
    s = v * 10;
end

function n = normalize(v)
    n = v / max(v);
end

% nested function (inside another function)
function outer(x)
    y = 0;
    function inner()
        y = y + x;    % can access outer's variables
    end
    inner();
    disp(y);
end

Escopo de Variáveis e Global

MATLAB passa argumentos por valor (copy-on-modify), então funções não podem alterar acidentalmente variáveis do chamador — ao contrário de C/Python. Use global para estado verdadeiramente compartilhado (declare em toda função que o usa), mas prefira passar argumentos. Variáveis persistent retêm seu valor entre chamadas de função (como static em C) — úteis para contadores, caches ou memoização. Inicialize variáveis persistent com verificação isempty na primeira chamada. Evite globals em favor de retornos de função ou funções aninhadas.

matlab
% base workspace variables
x = 10;

% functions have their OWN workspace
function y = myfunc()
    % x is NOT accessible here
    y = 5;
end

% pass by value (modifications don't affect caller)
function y = modify(v)
    v = v * 2;        % local copy
    y = v;
end
a = 5;
b = modify(a);        % b=10, a still 5

% global variables (use sparingly!)
global COUNTER
COUNTER = 0;
function increment()
    global COUNTER
    COUNTER = COUNTER + 1;
end

% persistent variables (like static in C)
function counter()
    persistent count
    if isempty(count)
        count = 0;
    end
    count = count + 1;
    disp(count);
end
04

Estruturas de Dados

Cell Arrays

Cell arrays são o contêiner do MATLAB para dados de tipos mistos (como listas em Python). Use chaves {} para acessar o CONTEÚDO de uma célula, e parênteses () para obter uma célula (útil para fatiamento). Essa distinção é crucial: c{1} retorna a string; c(1) retorna uma célula contendo a string. Células são essenciais para lidar com strings de comprimentos diferentes, matrizes de tamanho variável e dados irregulares. num2cell/mat2cell convertem entre arrays numéricos e células.

matlab
% cell arrays hold mixed data types
c = {'Alice', 30, [1 2 3], magic(2)};

% access with {} (content) vs () (cell)
c{1}                  % 'Alice' (the string itself)
c(1)                  % {'Alice'} (a 1x1 cell)
c{3}(2)               % 2 (second element of third cell)

% modify and append
c{2} = 31;
c{end+1} = 'new';     % append
c{5} = 'skip';        % auto-fills gaps with []

% multi-dimensional cell array
c2 = {'a', 'b'; 'c', 'd'};  % 2x2 cell

% iterate over cells
for i = 1:numel(c)
    disp(c{i});
end

% convert: cell2mat, mat2cell, num2cell
nums = num2cell(1:5);  % {1, 2, 3, 4, 5}

Structs e Tables

Structs agrupam dados relacionados com campos nomeados — como objetos sem métodos. Tables (R2013+) são o equivalente do MATLAB a dataframes: orientadas a colunas, com variáveis nomeadas e nomes de linhas. Tables são ideais para dados de CSV/Excel. Acesse colunas por nome (T.ages) ou índice. A indexação lógica funciona em linhas: T(T.age > 25, :) filtra linhas. summary() fornece estatísticas para cada coluna. Tables integram com readtable/writetable para entrada/saída de dados.

matlab
% struct: named fields with any data
user.name = 'Alice';
user.age = 30;
user.scores = [90 85 88];
disp(user.name);      % Alice

% struct constructor
s = struct('name', 'Bob', 'age', 25, 'active', true);

% array of structs
users(1) = struct('name', 'Alice', 'age', 30);
users(2) = struct('name', 'Bob', 'age', 25);
disp(users(2).name);  % Bob

% table (like a dataframe) — great for tabular data
names = {'Alice'; 'Bob'; 'Carol'};
ages = [30; 25; 28];
scores = [90; 85; 88];
T = table(names, ages, scores);

% access table columns
T.ages               % column as array
T(:, 2)              % column as table
T(1:2, :)            % first 2 rows
T.age > 26           % logical indexing
T(T.age > 26, :)     % rows where age > 26

% summary statistics
summary(T)

String Arrays e Manipulação de Char

MATLAB moderno (R2017+) prefere string arrays ("texto") a char arrays ('texto'). String arrays suportam operações vetorizadas: strlength, +, split, join, contains, matches, replace todos funcionam elemento a elemento. Char arrays ainda são comuns em código mais antigo e são necessários para algumas funções. Use string arrays para coleções de texto; elas lidam com comprimentos diferentes naturalmente (ao contrário de char arrays, que precisam de padding ou células).

matlab
% string array (R2017+) — recommended for text
names = ["Alice", "Bob", "Carol"];
names(1)              % "Alice"
names'                % column string array
strlength(names)      % [5 3 5]

% char array (legacy)
c = 'Hello World';
c(1:5)                % 'Hello'
size(c)               % [1 11]

% cell array of char vectors (legacy mixed-length)
old = {'Alice', 'Bob', 'Carol'};

% convert between types
s = string('hello');          % char -> string
c = char("hello");            % string -> char
cellarr = cellstr(names);     % string array -> cell of char

% combine and split
full = "Alice" + " " + "Smith";  % "Alice Smith"
parts = split("a,b,c", ",");     % ["a", "b", "c"]
joined = join(["a" "b" "c"], "-"); % "a-b-c"

% pattern matching
matches(names, 'A*')  % logical: [true false false]
contains(names, 'li') % [true false false]
replace("hello", 'l', 'L')  % "heLLo"

Containers.Map e Sets

containers.Map é o dicionário chave-valor do MATLAB (hash map) — útil para tabelas de consulta e configuração. Chaves podem ser strings ou números. isKey verifica existência; keys/values recuperam tudo. Operações de conjunto (union, intersect, setdiff, setxor, ismember) funcionam em arrays numéricos e cell arrays de strings. ismember testa pertinência e retorna um array lógico — ótimo para filtragem. Eles complementam a indexação lógica para manipulação de dados.

matlab
% map (dictionary / hash table)
m = containers.Map;
m('name') = 'Alice';
m('age') = 30;
m('scores') = [90 85];

% access
m('name')             % 'Alice'
isKey(m, 'name')      % true
keys(m)               % {'age', 'name', 'scores'}
values(m)             % {30, 'Alice', [90 85]}
remove(m, 'age');

% create with initial values
m2 = containers.Map({'a','b','c'}, {1, 2, 3});

% set operations
A = [1 2 3 4 5];
B = [4 5 6 7 8];
union(A, B)           % [1 2 3 4 5 6 7 8]
intersect(A, B)       % [4 5]
setdiff(A, B)         % [1 2 3]
setxor(A, B)          % [1 2 3 6 7 8]
ismember(3, A)        % true
ismember([1 6], A)    % [true false]

Categorical e Datetime

Arrays categorical armazenam dados de texto de forma eficiente (como inteiros com um mapa de rótulos) e suportam ordenação — ideais para respostas de pesquisa, classificações ou qualquer conjunto fixo de categorias. datetime/duration (R2014+) substituem as funções legadas datenum/datestr por um sistema de datas moderno e com reconhecimento de fuso horário. A aritmética de datas é intuitiva: adicione days(), hours(), minutes(). Esses tipos integram com tables e gráficos para análise de séries temporais.

matlab
% categorical data (efficient for repeated strings)
colors = categorical({'red', 'blue', 'red', 'green', 'blue'});
categories(colors)    % list of categories
summary(colors)       % count per category
ord = categorical({'low','med','high'}, ...
     {'low','med','high'}, 'Ordinal', true);
ord(1) < ord(2)       % true (ordered)

% datetime
t = datetime('now')   % current date and time
t = datetime(2024, 1, 15)
t.Format = 'yyyy-MM-dd HH:mm:ss';

% duration
d = duration(2, 30, 0);  % 2 hours 30 min
d = hours(2) + minutes(30);

% date arithmetic
t2 = t + days(7);     % add a week
t2 - t                % duration of 7 days

% date strings and numbers
s = datestr(t, 'yyyy-mm-dd');  % to string (legacy)
n = datenum(t);                 % to serial number
t = datetime(n, 'ConvertFrom', 'datenum');

% generate date range
dates = datetime(2024,1,1) + days(0:6);  % one week
05

Gráficos e Visualização

Gráficos 2D Básicos

plot() é a função central de gráficos 2D. O terceiro argumento especifica cor e estilo ('b-' = azul sólido). hold on permite sobrepor múltiplos gráficos; hold off libera. Sempre rotule os eixos e adicione uma legenda. axis([xmin xmax ymin ymax]) define limites. saveas/print exportam figuras — print com -r300 fornece 300 DPI. gcf obtém o handle da figura atual. A opção 'Location','best' posiciona a legenda automaticamente.

matlab
x = linspace(0, 2*pi, 100);

% line plot
plot(x, sin(x), 'b-', 'LineWidth', 2);
hold on;
plot(x, cos(x), 'r--', 'LineWidth', 2);
hold off;

% labels and legend
xlabel('x (radians)');
ylabel('amplitude');
title('Sine and Cosine');
legend('sin(x)', 'cos(x)', 'Location', 'best');
grid on;

% line styles: b- blue solid, r-- red dashed
% g: green dotted, m-. magenta dash-dot
% markers: o circle, * star, s square, + plus

% axis control
axis([0 2*pi -1.5 1.5]);  % [xmin xmax ymin ymax]
xlim([0 2*pi]);
ylim([-1.5 1.5]);

% save figure
saveas(gcf, 'plot.png');
print('-dpng', '-r300', 'plot.png');

Múltiplos Gráficos e Subplots

subplot(r, c, n) divide a figura em uma grade r-por-c e seleciona a n-ésima célula para plotagem. tiledlayout (R2019+) é a substituição moderna — espaçamento mais limpo e um título compartilhado. nexttile avança para o próximo subplot. yyaxis cria gráficos com dois eixos y (esquerdo e direito) para dados com escalas diferentes. Sempre chame figure primeiro para abrir uma nova janela, ou você sobrescreverá o gráfico atual.

matlab
% subplot(rows, cols, index)
figure;
subplot(2, 2, 1);
plot(x, sin(x));
title('Sine');

subplot(2, 2, 2);
plot(x, cos(x));
title('Cosine');

subplot(2, 2, 3);
plot(x, tan(x));
title('Tangent');
ylim([-5 5]);

subplot(2, 2, 4);
plot(x, exp(-x));
title('Decay');

% tiledlayout (newer, cleaner)
figure;
t = tiledlayout(2, 2);
nexttile; plot(x, sin(x)); title('Sine');
nexttile; plot(x, cos(x)); title('Cosine');
nexttile; plot(x, tan(x)); title('Tangent');
nexttile; plot(x, exp(-x)); title('Decay');
title(t, 'Trig Functions');  % overall title

% multiple y-axes
yyaxis left;  plot(x, sin(x));
yyaxis right; plot(x, 100*cos(x));

Gráficos Especializados

MATLAB tem dezenas de gráficos especializados: bar/barh (gráficos de barras), histogram (substitui hist), scatter (com mapeamento opcional de cor/tamanho), pie, area, stem, stairs, compass, feather. scatter(x, y, size, color, 'filled') é especialmente poderoso — o 4º argumento colore pontos por um valor, revelando uma terceira dimensão. histogram com 'Normalization','pdf' normaliza para uma densidade de probabilidade para comparação com distribuições contínuas.

matlab
% bar chart
bar([1 2 3], [10 15 7]);
bar([1 2 3; 4 5 6], 'grouped');  % grouped bars
bar([1 2 3; 4 5 6], 'stacked');  % stacked bars

% histogram
data = randn(1000, 1);
histogram(data, 30);    % 30 bins
histogram(data, 'Normalization', 'pdf');

% scatter plot
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y, 50, 'filled');
% colored scatter
scatter(x, y, 50, y, 'filled');  % color by y value
colorbar;

% pie chart
pie([30 20 50], {'A', 'B', 'C'});

% area plot
area(1:5, [1 3 2 4 5]);

% stem (discrete)
stem(0:5, [1 4 9 16 25 36]);

% boxplot (requires Statistics toolbox)
boxplot(randn(100, 3));

Gráficos 3D e Superfícies

plot3 desenha linhas paramétricas 3D. Para superfícies, primeiro crie uma grade com meshgrid, depois calcule Z = f(X, Y). surf desenha uma superfície preenchida; mesh desenha um wireframe; contour desenha curvas de nível 2D. colormap (jet, parula, hot, cool) controla o mapeamento de cores; colorbar adiciona uma legenda. shading interp remove as linhas de grade para gradientes suaves. view(az, el) define o ângulo da câmera. 'EdgeColor','none' oculta as linhas de malha para um visual limpo.

matlab
% 3D line plot
t = 0:0.1:10*pi;
plot3(sin(t), cos(t), t);
xlabel('x'); ylabel('y'); zlabel('z');

% meshgrid for surface plots
[X, Y] = meshgrid(-2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);

% surface plots
figure;
subplot(1, 3, 1);
surf(X, Y, Z);     % surface
title('surf');

subplot(1, 3, 2);
mesh(X, Y, Z);     % wireframe
title('mesh');

subplot(1, 3, 3);
contour(X, Y, Z, 20);  % contour lines
title('contour');

% colored surface with colorbar
figure;
surf(X, Y, Z, 'EdgeColor', 'none');
colorbar;
colormap jet;
shading interp;     % smooth colors

% view angle
view(45, 30);       % azimuth, elevation
axis equal;

Personalização de Gráficos e Exportação

Quase todos os aspectos visuais são personalizáveis via pares nome-valor ou set(). Cores são triplas RGB [r g b] de 0 a 1. set(gca, ...) modifica os eixos atuais (fonte, escala, limites). MATLAB suporta LaTeX em títulos/rótulos com 'Interpreter','latex'. exportgraphics (R2020+) é a função moderna de exportação com opções vetoriais e de alto DPI. Use handles de figura (f1, f2) para gerenciar múltiplas janelas. annotation() adiciona setas, caixas de texto e formas.

matlab
% customize line appearance
plot(x, y, ...
    'Color', [0.2 0.6 0.8], ...     % RGB 0-1
    'LineWidth', 2, ...
    'Marker', 'o', ...
    'MarkerSize', 8, ...
    'MarkerFaceColor', 'r');

% annotations
text(1, 0.5, 'important point');
annotation('arrow', [0.3 0.5], [0.3 0.5]);

% figure and axes properties
set(gcf, 'Position', [100 100 800 600]);
set(gca, 'FontSize', 14, 'FontName', 'Arial');
set(gca, 'XScale', 'log');  % log scale

% latex in labels
title('Function: \\alpha + \\beta^2', 'Interpreter', 'latex');

% export high quality
exportgraphics(gcf, 'plot.pdf', 'ContentType', 'vector');
exportgraphics(gcf, 'plot.png', 'Resolution', 300);

% legend customization
legend('show', 'Location', 'northwest', ...
       'FontSize', 12, 'Box', 'off');

% multiple figures
f1 = figure; plot(x, sin(x));
f2 = figure; plot(x, cos(x));
figure(f1);  % switch back to f1
06

Análise de Dados e Estatística

Estatística Descritiva

MATLAB fornece funções estatísticas abrangentes. mean/median/mode para tendência central; std/var/range/iqr para dispersão. Por padrão, estas operam ao longo da primeira dimensão (colunas). Use 'omitnan' para pular valores NaN (importante para dados do mundo real). quantile/prctile fornecem percentis. O Statistics and Machine Learning Toolbox adiciona geomean, harmmean, zscore e funções de distribuição. Sempre verifique NaNs antes da análise — eles se propagam pela maioria das operações.

matlab
data = [1 2 3 4 5 6 7 8 9 10];

% central tendency
mean(data)            % 5.5
median(data)          % 5.5
mode(data)            % 1 (first mode)
geomean(data)         % geometric mean (Stats toolbox)
harmmean(data)        % harmonic mean

% dispersion
std(data)             % standard deviation
var(data)             % variance
range(data)           % max - min
iqr(data)             % interquartile range
mad(data)             % mean absolute deviation

% extremes and quantiles
min(data); max(data);
quantile(data, 0.25)  % 25th percentile
prctile(data, 95)     % 95th percentile

% along dimensions
A = randn(100, 3);
mean(A)               % mean of each column
mean(A, 2)            % mean of each row
mean(A, 'all')        % overall mean

% ignoring NaNs
data(5) = NaN;
mean(data, 'omitnan') % skip NaN values
nanmean(data)         % legacy equivalent

Ajuste de Curvas e Regressão

polyfit ajusta um polinômio de grau fornecido; polyval o avalia. Para regressão linear, regress() fornece coeficientes mais estatísticas (R², estatística F, valor-p). corrcoef retorna a matriz de correlação completa. O Curve Fitting Toolbox fornece fit() para ajuste interativo e programático com modelos personalizados. lsqcurvefit (Optimization Toolbox) ajusta modelos não lineares arbitrários. Sempre plote o ajuste contra os dados para verificar a qualidade — polinômios de alta ordem podem sobreajustar.

matlab
% polynomial fit
x = 0:0.5:10;
y = 2*x + 1 + randn(size(x))*2;  % noisy linear data

% linear least squares (degree 1)
p = polyfit(x, y, 1);   % [slope, intercept]
yfit = polyval(p, x);
plot(x, y, 'o', x, yfit, '-');

% higher-order polynomial
p3 = polyfit(x, y, 3);
yfit3 = polyval(p3, x);

% fit with fittype (Curve Fitting Toolbox)
f = fit(x', y', 'poly2');  % quadratic
plot(f, x, y);

% custom model fit
% fit y = a*exp(b*x) using lsqcurvefit
model = @(p, x) p(1)*exp(p(2)*x);
params = lsqcurvefit(model, [1 0.1], x, y);

% correlation
r = corrcoef(x, y);     % correlation matrix
r = corr(x, y);         % correlation coefficient

% linear regression with stats
X = [ones(size(x)) x'];  % design matrix
[b, bint, r, rint, stats] = regress(y', X);
% stats = [R^2, F, p, error_var]

Interpolação e Reamostragem

interp1 interpola dados 1D — 'linear' é rápido, 'spline' é suave (pode ultrapassar), 'pchip' preserva a forma (sem ultrapassagem). interp2 faz o mesmo para grades 2D. Para consultas repetidas, griddedInterpolant é mais eficiente (construa uma vez, consulte muitas vezes). resample muda a taxa de amostragem de um sinal (requer Signal Processing Toolbox). Sempre escolha o método com base nos seus dados: spline para funções suaves, pchip para dados monótonos, nearest para categóricos.

matlab
% 1D interpolation
x = 0:5;
y = [0 1 4 9 16 25];
xi = 0:0.5:5;

yi = interp1(x, y, xi, 'linear');   % linear (default)
yi = interp1(x, y, xi, 'spline');   % cubic spline
yi = interp1(x, y, xi, 'pchip');    % shape-preserving
yi = interp1(x, y, xi, 'nearest');  % nearest neighbor

% extrapolation
yi = interp1(x, y, xi, 'linear', 'extrap');

% 2D interpolation
[X, Y] = meshgrid(0:2:10);
Z = X.^2 + Y.^2;
[Xi, Yi] = meshgrid(0:0.5:10);
Zi = interp2(X, Y, Z, Xi, Yi, 'spline');

% resample signal to new rate
y_resampled = resample(y, 3, 2);  % 3/2 times the rate

% griddedInterpolant (efficient for repeated queries)
F = griddedInterpolant(x, y, 'spline');
y1 = F(2.5);
y2 = F([1.5 3.5 4.5]);

FFT e Processamento de Sinais

fft calcula a Transformada Rápida de Fourier — a base da análise de frequência. A saída é complexa; use abs() para a magnitude. Converta para um espectro unilateral pegando a primeira metade e dobrando (exceto DC e Nyquist). As frequências variam de 0 a fs/2 (Nyquist). ifft inverte de volta ao domínio do tempo. A filtragem no domínio da frequência (zerar frequências indesejadas) é simples, mas pode causar ringing; use designfilt para filtros adequados. spectrogram mostra o conteúdo de frequência ao longo do tempo.

matlab
% generate a signal with two frequencies
fs = 1000;                    % sampling rate (Hz)
t = 0:1/fs:1-1/fs;            % 1 second of time
x = 2*sin(2*pi*50*t) + 1*sin(2*pi*120*t);

% compute FFT
N = length(x);
Y = fft(x);
P2 = abs(Y/N);                % two-sided spectrum
P1 = P2(1:N/2+1);             % one-sided spectrum
P1(2:end-1) = 2*P1(2:end-1);
f = fs*(0:(N/2))/N;

% plot
plot(f, P1);
xlabel('Frequency (Hz)');
ylabel('Amplitude');
title('Single-Sided Spectrum');

% filtering (simple low-pass)
cutoff = 100;  % Hz
Y_filt = Y;
Y_filt(f > cutoff) = 0;       % zero out high freqs (simplified)
x_filtered = real(ifft(Y_filt));

% spectrogram
spectrogram(x, 128, 120, 128, fs, 'yaxis');

Otimização e Encontrar Raízes

fzero encontra raízes de funções 1D (precisa de um intervalo delimitador ou palpite). fminbnd minimiza uma função 1D em um intervalo limitado; fminsearch usa Nelder-Mead para otimização multivariada sem restrições. fmincon (Optimization Toolbox) lida com restrições. linprog resolve programas lineares. Sempre forneça um bom palpite inicial (x0) para solvers iterativos. Verifique a saída exitflag para confirmar convergência. Para otimização global, use GlobalSearch ou MultiStart.

matlab
% find root of f(x) = 0
f = @(x) x^2 - 2;
x_root = fzero(f, 1);         % ~1.4142 (sqrt(2))
x_root = fsolve(f, 1);        % alternative

% minimize a function
fun = @(x) (x-3)^2 + 1;
[x_min, f_min] = fminbnd(fun, 0, 5);  % bounded 1D
% x_min = 3, f_min = 1

% multivariate minimization
fun2 = @(x) x(1)^2 + x(2)^2;  % sphere function
x0 = [1, 1];
[x_opt, f_opt] = fminsearch(fun2, x0);
% x_opt ≈ [0, 0]

% constrained optimization (Optimization Toolbox)
% minimize fun subject to A*x <= b
A = []; b = []; Aeq = []; beq = [];
lb = [0 0]; ub = [];
[x, fval] = fmincon(fun2, x0, A, b, Aeq, beq, lb, ub);

% linear programming
% minimize f'*x subject to A*x <= b
f = [-1; -1];                 % maximize x+y
A = [1 1; -1 0; 0 -1];
b = [2; 0; 0];
[x, fval] = linprog(f, A, b);
07

Entrada/Saída de Arquivos e Importação de Dados

Arquivos MAT e Save/Load

.mat é o formato binário nativo do MATLAB — rápido, compacto e preserva todos os tipos de variáveis. save/load são os comandos principais. Use -v7.3 para arquivos acima de 2GB (baseado em HDF5). -ascii exporta para texto legível (perde informações de tipo). Carregar em um struct (s = load(...)) evita poluir o workspace. clear remove variáveis; clearvars -except mantém as especificadas. Sempre salve resultados intermediários em computações longas para permitir retomada.

matlab
% save variables to a .mat file
x = 1:10;
y = sin(x);
save('data.mat');             % save ALL variables
save('data.mat', 'x', 'y');   % save specific variables
save('data.mat', '-append');  % add more variables

% load variables
load('data.mat');             % load all into workspace
loaded = load('data.mat');    % load into a struct
loaded.x                      % access via struct

% save with compression
save('data.mat', 'x', 'y', '-v7.3');  % large files (>2GB)
save('data.mat', '-v7');              % compressed (default)

% save specific format
save('data.txt', 'x', '-ascii');      % plain text
save('data.csv', 'x', '-ascii', '-double');

% clear variables
clear x y;                    % remove specific
clear all;                    % remove everything
clearvars -except x;          % keep only x

Lendo Arquivos de Texto e CSV

readtable é a maneira moderna de ler CSV/Excel — retorna uma table com colunas nomeadas e lida com cabeçalhos automaticamente. readmatrix lê dados numéricos em uma matriz. Para controle total, use fopen/fgetl/fprintf/fclose (sempre feche os arquivos!). fscanf lê dados formatados como C. Sempre verifique fid para erros: se fid == -1, o arquivo não pôde ser aberto. readcell lida com dados de tipos mistos que não se encaixam em uma matriz ou table.

matlab
% readtable (recommended for tabular data)
T = readtable('data.csv');
T = readtable('data.xlsx', 'Sheet', 'Sheet1');
T = readtable('data.csv', 'Delimiter', ',');

% access columns by name
T.Var1; T.age;

% readmatrix (numeric data)
M = readmatrix('numbers.csv');
M = readmatrix('data.txt', 'Delimiter', '\t');

% readcell (mixed data)
C = readcell('mixed.csv');

% low-level file I/O
fid = fopen('data.txt', 'r');
while ~feof(fid)
    line = fgetl(fid);
    disp(line);
end
fclose(fid);

% read formatted data
fid = fopen('data.txt', 'r');
data = fscanf(fid, '%f %f', [2, inf]);
fclose(fid);

% write text
fid = fopen('output.txt', 'w');
fprintf(fid, 'Result: %.2f\n', 3.14159);
fclose(fid);

Excel e Entrada/Saída de Planilhas

readtable/writetable são as funções recomendadas para I/O do Excel. Elas lidam com cabeçalhos, tipos e planilhas automaticamente. detectImportOptions permite personalizar como as colunas são analisadas (por exemplo, forçar uma coluna para int32 ou string). Use 'Range' para ler/gravar células específicas. 'WriteMode','append' adiciona linhas a uma planilha existente. Para arquivos Excel grandes, considere CSV (mais rápido) ou .mat (nativo). O toolbox Spreadsheet Link conecta o MATLAB diretamente ao Excel.

matlab
% read Excel files
T = readtable('data.xlsx');
T = readtable('data.xlsx', 'Sheet', 'Sales', 'Range', 'A1:D100');

% numeric data only
M = readmatrix('data.xlsx', 'Sheet', 1);

% write to Excel
writetable(T, 'output.xlsx');
writetable(T, 'output.xlsx', 'Sheet', 'Results');

% write matrix
writematrix(M, 'output.xlsx', 'Sheet', 1);

% cell array (mixed types)
C = {'Name','Age'; 'Alice',30; 'Bob',25};
writecell(C, 'people.xlsx');

% append to existing sheet
writetable(T, 'data.xlsx', 'Sheet', 1, 'WriteMode', 'append');

% read specific range
T = readtable('data.xlsx', 'Range', 'B2:D10');

% detect import options (customize parsing)
opts = detectImportOptions('data.csv');
opts = setvartype(opts, 'age', 'int32');
T = readtable('data.csv', opts);

Trabalhando com Caminhos e Diretórios

dir() retorna um array de structs com .name, .date, .bytes, .isdir, .datenum para cada arquivo. fullfile junta caminhos de forma portátil (usa o separador correto em cada SO). fileparts divide um caminho em diretório, nome e extensão. exist('name', 'file') verifica se um arquivo existe. addpath adiciona diretórios ao caminho de pesquisa do MATLAB para que funções neles sejam acessíveis; savepath persiste isso. Esses são essenciais para processar arquivos em lote em pastas.

matlab
% current directory
pwd
cd('C:\\Users\\data')

% list files
files = dir();              % struct array of files
files = dir('*.mat');       % filter by pattern
files = dir('subdir/');     % list a subdirectory

% access file info
for i = 1:length(files)
    if ~files(i).isdir
        fprintf('%s - %d bytes\n', files(i).name, files(i).bytes);
    end
end

% path operations
fullfile('data', '2024', 'file.csv')  % data/2024/file.csv
[filepath, name, ext] = fileparts('C:\\data\\test.csv')
% filepath = 'C:\data', name = 'test', ext = '.csv'

% create and remove directories
mkdir('output');
rmdir('output', 's');      % remove recursively

% file existence
if exist('data.mat', 'file')
    load('data.mat');
end

% add folder to path
addpath('C:\\myfunctions');
savepath();                 % save for future sessions

Imagens e Áudio

imread/imshow/imwrite lidam com imagens (JPEG, PNG, TIFF, BMP). Imagens são armazenadas como matrizes uint8 (0-255) ou doubles (0-1). rgb2gray converte cor para tons de cinza. O Image Processing Toolbox adiciona imresize, imrotate, imfilter, detecção de bordas e operações morfológicas. audioread/audiowrite/sound lidam com arquivos de áudio. Imagens e áudio são apenas matrizes, então todas as ferramentas matemáticas e de gráficos do MATLAB se aplicam diretamente.

matlab
% read and display an image
img = imread('photo.jpg');
imshow(img);
[m, n, c] = size(img);     % dimensions, c=3 for RGB

% write image
imwrite(img, 'output.png');
imwrite(img, 'output.jpg', 'Quality', 90);

% convert to grayscale
if size(img, 3) == 3
    gray = rgb2gray(img);
    imshow(gray);
end

% image processing
img2 = imresize(img, 0.5);          % scale 50%
img3 = imrotate(img, 45);           % rotate 45 degrees
img4 = imadjust(img, [0.2 0.8], []); % contrast adjust

% audio
[y, fs] = audioread('song.wav');    % y = samples, fs = sample rate
sound(y, fs);                        % play audio
audiowrite('output.wav', y, fs);

% record audio
recObj = audiorecorder(44100, 16, 1);
recordblocking(recObj, 3);           % record 3 seconds
y = getaudiodata(recObj);
08

Matemática Simbólica e Avançada

Variáveis Simbólicas e Simplificação

O Symbolic Math Toolbox permite computação exata (não numérica). syms declara variáveis simbólicas. simplify, expand, factor, collect manipulam expressões algébricas. subs substitui valores ou variáveis. vpa (aritmética de precisão variável) calcula com precisão arbitrária — útil quando o arredondamento de ponto flutuante importa. Resultados simbólicos são exatos (por exemplo, sqrt(2) permanece como sqrt(2), não 1.4142...). Converta para numérico com double() quando necessário.

matlab
% create symbolic variables (Symbolic Math Toolbox)
syms x y z

% symbolic expressions
f = x^2 + 2*x + 1;
g = sin(x)^2 + cos(x)^2;

% simplify
simplify(f)             % (x + 1)^2
simplify(g)             % 1
expand((x+1)^3)         % x^3 + 3*x^2 + 3*x + 1
factor(x^2 - 1)         % (x - 1)*(x + 1)
collect(x^2 + 2*x + x^2)% 2*x^2 + 2*x

% substitute values
subs(f, x, 3)           % 16 (f at x=3)
subs(f, x, y)           % y^2 + 2*y + 1

% pretty print
pretty(f)
disp(f)

% convert between numeric and symbolic
double(sym('1/3'))      % 0.3333
sym(0.5)                % 1/2
vpa(pi, 50)             % 50-digit pi: 3.1415926535897...

Cálculo: Derivadas e Integrais

diff deriva (passe um segundo argumento para derivadas de ordem superior). int integra — sem limites retorna a antiderivada; com limites calcula a integral definida. limit calcula limites (incluindo unilaterais com 'left'/'right'). taylor expande uma função como uma série de Taylor em torno de um ponto. Estas retornam expressões simbólicas; use double() ou vpa() para resultados numéricos. O cálculo simbólico é exato e evita o arredondamento numérico.

matlab
syms x

% differentiation
f = x^3 + 2*x^2 + x;
df = diff(f)            % 3*x^2 + 4*x + 1
d2f = diff(f, 2)        % second derivative: 6*x + 4
diff(f, x, 3)           % third derivative: 6

% partial derivatives
syms x y
g = x^2 * y + sin(x*y);
diff(g, x)              % 2*x*y + y*cos(x*y)
diff(g, y)              % x^2 + x*cos(x*y)

% integration
int(x^2)                % x^3/3 (indefinite)
int(x^2, x, 0, 1)       % 1/3 (definite, 0 to 1)
int(sin(x), x, 0, pi)   % 2

% limits
limit(sin(x)/x, x, 0)   % 1
limit(1/x, x, inf)      % 0
limit(1/x, x, 0, 'left')  % -inf

% Taylor series
taylor(exp(x), x, 0, 'Order', 6)
% 1 + x + x^2/2 + x^3/6 + x^4/24 + x^5/120

Resolvendo Equações

solve encontra soluções exatas (simbólicas) para equações e sistemas algébricos. Para equações sem soluções de forma fechada, use vpasolve (numérico). dsolve resolve equações diferenciais ordinárias simbolicamente — forneça condições iniciais/de contorno para uma solução particular. Os resultados são simbólicos; converta com double/vpa para gráficos. Para EDOs complexas que não podem ser resolvidas simbolicamente, use ode45 (solver numérico). Sempre verifique se solve retornou vazio (nenhuma solução encontrada).

matlab
syms x y

% solve algebraic equations
solve(x^2 - 4 == 0, x)        % [2; -2]
solve(x^2 + 1 == 0, x)        % [i; -i] (complex roots)

% solve a system
sol = solve([x + y == 5, x - y == 1], [x, y]);
sol.x                        % 3
sol.y                        % 2

% solve with parameters
syms a b c
r = solve(a*x^2 + b*x + c == 0, x);
% r = -(b + (b^2 - 4*a*c)^(1/2))/(2*a), ...

% numerical solve (no closed form)
vpasolve(x^5 - 3*x + 1 == 0, x)

% differential equations
syms y(t) t
ode = diff(y, t) == -k*y;     % dy/dt = -k*y
cond = y(0) == y0;
ySol(t) = dsolve(ode, cond);  % y0*exp(-k*t)

% system of ODEs
syms x(t) y(t)
eq1 = diff(x,t) == y;
eq2 = diff(y,t) == -x;
sol = dsolve([eq1, eq2]);

Transformadas de Laplace e Fourier

laplace/ilaplace calculam o par da Transformada de Laplace — essencial para resolver EDOs lineares e analisar sistemas de controle. fourier/ifourier fazem o mesmo para a Transformada de Fourier (frequência contínua). ztrans/iztrans lidam com sinais discretos (filtros digitais). O fluxo de trabalho para resolver EDOs via Laplace: transforme a EDO em algébrica, resolva para Y(s), depois faça a transformada inversa. Estas são operações simbólicas exatas; para transformadas numéricas use fft.

matlab
syms t s w

% Laplace transform
f = exp(-a*t);
F = laplace(f)          % 1/(a + s)
% default: f(t) -> F(s)

% inverse Laplace
f2 = ilaplace(1/(s+1))  % exp(-t)

% Fourier transform
g = exp(-t^2);
G = fourier(g)          % pi^(1/2)*exp(-w^2/4)

% inverse Fourier
g2 = ifourier(G)

% Z-transform (for discrete signals)
syms n z
h = a^n;
H = ztrans(h)           % -z/(a - z) (for |z| > |a|)
h2 = iztrans(z/(z-a))   % a^n

% apply transform to solve ODE
% y'' + y = 0, y(0)=0, y'(0)=1
syms y(t) Y(s)
ode = diff(y, t, 2) + y == 0;
% take Laplace of both sides, solve for Y(s), then invert

Solvers Numéricos de EDO

ode45 é o solver de EDO padrão — um método Runge-Kutta (4,5) que é preciso e adaptativo. Para sistemas, o estado é um vetor v, e a função retorna um vetor coluna de derivadas. ode15s é para problemas stiff (onde as dinâmicas operam em escalas de tempo muito diferentes). odeset configura tolerâncias e eventos. Para passar parâmetros, use uma função anônima que os captura. Sempre plote a solução para verificar se parece razoável. Para problemas de valor de contorno, use bvp4c.

matlab
% solve dy/dt = f(t, y) numerically with ode45

% define the ODE as a function
f = @(t, y) -2*y;       % dy/dt = -2y (exponential decay)

% solve on [0, 5] with y(0) = 1
[t, y] = ode45(f, [0 5], 1);
plot(t, y);
xlabel('t'); ylabel('y');

% system of ODEs (Lotka-Volterra predator-prey)
% dx/dt = 1.5x - xy,  dy/dt = -0.7y + 0.1xy
ode_sys = @(t, v) [1.5*v(1) - v(1)*v(2);
                   -0.7*v(2) + 0.1*v(1)*v(2)];
[t, V] = ode45(ode_sys, [0 20], [10; 5]);
plot(t, V(:,1), 'b', t, V(:,2), 'r');
legend('Prey', 'Predator');

% stiff ODE solver (for fast dynamics)
[t, y] = ode15s(f, [0 5], 1);

% set options
opts = odeset('RelTol', 1e-6, 'AbsTol', 1e-9);
[t, y] = ode45(f, [0 5], 1, opts);

% pass parameters via anonymous function
a = 0.5;
f = @(t, y, a) -a*y;
[t, y] = ode45(@(t,y) f(t,y,a), [0 10], 1);
09

Aprofundamento em Operações de Matrizes

Equações Lineares e Decomposições

O operador barra invertida (\) é o solver linear preferido do MATLAB — ele seleciona automaticamente LU, QR ou Cholesky com base na matriz. Nunca use inv(A)*b a menos que realmente precise da inversa; é mais lento e menos numericamente estável. lu, qr e chol retornam as fatorações de matriz padrão. eig calcula autovalores/autovetores, e svd fornece a decomposição em valores singulares — fundamental para PCA, pseudo-inversas e aproximações de baixo rank.

matlab
% solve Ax = b
A = [3 2 -1; 2 -2 4; -1 0.5 -1];
b = [1; -2; 0];
x = A \ b;             % backslash: preferred solver
x = inv(A) * b;         % explicit inverse (slower, less stable)
x = linsolve(A, b);     % optimized linear solver

% LU, QR, Cholesky decompositions
[L, U, P] = lu(A);      % PA = LU
[Q, R] = qr(A);         % QR factorization
R = chol(A'*A);         % Cholesky (needs SPD matrix)

% eigenvalues and eigenvectors
[V, D] = eig(A);        % A*V = V*D
eigenvalues = diag(D);

% singular value decomposition
[U, S, V] = svd(A);     % A = U*S*V'

Matrizes Esparsas

Matrizes esparsas armazenam apenas entradas não nulas — essencial ao trabalhar com matrizes dimensionais de 100k+ que são em sua maioria zeros (comum em métodos de elementos finitos, algoritmos de grafos e EDPs). sparse(i,j,v) constrói a partir da forma de triplete; full converte de volta. A aritmética entre matrizes esparsas permanece esparsa. nnz conta os não nulos e spy plota o padrão de esparsidade. Solves lineares esparsos (A\b) usam solvers especializados como UMFPACK automaticamente.

matlab
% create sparse matrix (memory efficient for large, mostly-zero)
S = sparse(10000, 10000);
S(1, 1) = 5;
S(2, 3) = 10;

% from triplets (row, col, value)
i = [1 2 2 3];
j = [1 1 3 3];
v = [4 5 7 9];
S = sparse(i, j, v, 3, 3);

% convert sparse <-> full
F = full(S);
S2 = sparse(F);

% sparse identity and diagonal
I = speye(1000);
D = spdiags(ones(1000,1), 0, 1000, 1000);

% operations preserve sparsity
nnz(S)                  % number of nonzeros
spy(S)                  % visualize sparsity pattern

Funções de Matriz e Reshape

reshape reorganiza elementos em ordem coluna-major (descendo colunas primeiro) — uma fonte comum de bugs ao portar de linguagens linha-major. flipud/fliplr/rot90 são úteis para reverter ou transpor de maneiras não padrão. repmat cria mosaicos de uma matriz; repelem duplica elementos individuais. A concatenação usa [A; B] (vertical) e [A B] (horizontal), ou horzcat/vertcat para uso programático. arrayfun aplica uma função elemento a elemento quando a vetorização não é possível.

matlab
A = [1 2 3; 4 5 6];

% reshape (column-major order!)
B = reshape(A, 3, 2);   % [1 5; 4 3; 2 6]
C = reshape(A, 6, 1);   % column vector

% flip and rotate
flipud(A)               % flip up-down
fliplr(A)               % flip left-right
rot90(A)                % rotate 90 degrees
rot90(A, 2)             % rotate 180 degrees

% repmat and repelem
repmat([1 2], 2, 3)     % tile 2x3
repelem([1 2 3], 2)     % [1 1 2 2 3 3]

% concatenation
[A; A]                  % vertical (must have same # cols)
[A A]                   % horizontal (must have same # rows)
horzcat(A, A); vertcat(A, A);

% matrix functions (apply element-wise via fun)
arrayfun(@(x) x^2, A)

Broadcasting e Vetorização

Desde R2016b, o MATLAB automaticamente faz broadcasting (expande) dimensões de tamanho 1 para corresponder ao outro operando — sem necessidade de bsxfun ou repmat. A vetorização (operar em arrays inteiros em vez de loops elemento a elemento) é o maior ganho de desempenho no MATLAB, porque as rotinas BLAS/LAPACK subjacentes são altamente otimizadas. Sempre pré-aloque arrays antes de preenchê-los em um loop; crescer arrays dinamicamente força realocação a cada iteração e é O(n^2).

matlab
% MATLAB implicitly expands (broadcasts) since R2016b
A = [1 2 3; 4 5 6];     % 2x3
b = [10 20 30];         % 1x3
C = A + b;              % 2x3: b added to each row

c = [1; 2];             % 2x1
D = A + c;              % 2x3: c added to each column

% vectorized operations (much faster than loops)
x = linspace(0, 2*pi, 1e6);
y = sin(x) .* cos(x);   % element-wise, no loop needed

% avoid growing arrays in loops
% BAD: for k=1:1e6, s(k) = k; end
% GOOD: preallocate
s = zeros(1, 1e6);
for k = 1:1e6
    s(k) = k;
end

% even better: vectorize
s = 1:1e6;

% bsxfun (legacy, before auto-broadcasting)
E = bsxfun(@plus, A, b);

Aplicações de Álgebra Linear Numérica

O operador barra invertida resolve problemas de mínimos quadrados automaticamente quando A é retangular (mais linhas que colunas). polyfit/polyval ajustam e avaliam polinômios. PCA é mais estavelmente calculado via SVD da matriz de dados centralizada — as colunas de V são as direções principais e diag(S) fornece os desvios padrão. cond(A) mede a sensibilidade numérica; valores acima de 1e12 significam que a matriz é essencialmente singular para aritmética de precisão dupla.

matlab
% least-squares fit (overdetermined system)
A = [1 1; 1 2; 1 3; 1 4];
b = [6; 5; 7; 10];
x = A \ b;             % least-squares solution

% polynomial curve fitting
t = 0:0.1:5;
y = 2*t.^2 + 1 + 0.5*randn(size(t));
p = polyfit(t, y, 2);   % degree-2 fit
yfit = polyval(p, t);

% PCA via SVD
X = randn(100, 5);
Xc = X - mean(X);       % center
[U, S, V] = svd(Xc, 0);
scores = Xc * V;        % principal components
variances = diag(S).^2 / (size(X,1)-1);

% condition number (numerical stability)
cond(A)                 % large = ill-conditioned
10

Aprofundamento em Gráficos 2D e 3D

Gráficos de Linha e Personalização

plot é a função de gráficos 2D padrão. Strings de especificação de linha como 'r--' (vermelho tracejado) combinam cor, marcador e estilo. hold on permite sobrepor múltiplos gráficos. subplot(m,n,k) cria uma grade m-por-n e seleciona a k-ésima célula (linha-major). set(gca, ...) modifica os eixos atuais; gcf é a figura atual. print com -dpng e -r300 exporta um PNG de 300 DPI — qualidade muito superior a saveas.

matlab
x = linspace(0, 2*pi, 200);
y1 = sin(x); y2 = cos(x);

figure;
plot(x, y1, 'b-', 'LineWidth', 2); hold on;
plot(x, y2, 'r--', 'LineWidth', 1.5);
hold off;

% annotations
xlabel('Angle (rad)');
ylabel('Amplitude');
title('Sine and Cosine');
legend('sin(x)', 'cos(x)', 'Location', 'best');
grid on;

% axis control
axis([0 2*pi -1.2 1.2]);
set(gca, 'FontSize', 12, 'FontName', 'Arial');

% multiple subplots
subplot(2, 1, 1); plot(x, y1);
subplot(2, 1, 2); plot(x, y2);

% save figure
saveas(gcf, 'plot.png');
print('-dpng', '-r300', 'plot_hi.png');

Gráficos de Superfície 3D, Malha e Contorno

meshgrid cria as grades de coordenadas X, Y necessárias para gráficos de superfície. surf desenha uma superfície preenchida, mesh desenha um wireframe e contour projeta para curvas de nível 2D. colormap muda o mapeamento de cores (jet, parula, hot, cool, gray); parula é o padrão moderno. shading interp suaviza as transições de cor. plot3 desenha curvas paramétricas 3D. view(az, el) define o ângulo da câmera; axis equal previne distorção.

matlab
[X, Y] = meshgrid(-2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);

figure;
subplot(2,2,1); surf(X, Y, Z);    title('surf');
subplot(2,2,2); mesh(X, Y, Z);    title('mesh');
subplot(2,2,3); contour(X, Y, Z, 20); title('contour');
subplot(2,2,4); surfc(X, Y, Z);   title('surfc');

% color mapping
colormap(jet(256)); colorbar;
shading interp;        % smooth colors

% 3D line plot (parametric)
t = 0:0.01:10;
plot3(sin(t), cos(t), t, 'LineWidth', 2);
xlabel('x'); ylabel('y'); zlabel('z');

% view angle
view(45, 30);          % azimuth, elevation
axis equal;

Gráficos Estatísticos e Especializados

histogram (R2014b+) substitui hist com mais recursos como 'Normalization' para PDFs. boxplot compara distribuições entre grupos. scatterhist mostra um gráfico de dispersão com histogramas marginais — ótimo para visualizar correlações. bar suporta layouts agrupados e empilhados. errorbar adiciona visualização de incerteza. Esses gráficos especializados são essenciais para apresentação de dados científicos e análise exploratória.

matlab
data = randn(1000, 1);

% histogram (modern)
histogram(data, 30, 'Normalization', 'pdf');
hold on; x = -4:0.1:4; plot(x, normpdf(x), 'r-', 'LineWidth', 2);

% box plot by group
g = randi([1 3], 100, 1);
boxplot(data, g);

% scatter with marginal histograms
x = randn(200,1); y = x + 0.5*randn(200,1);
scatterhist(x, y);

% bar chart
sales = [10 25 30; 20 15 40];
bar(sales); legend('Q1','Q2','Q3');

% pie chart
pie([30 20 50], {'A','B','C'});

% error bars
y = [1 2 3 4]; e = [0.1 0.2 0.15 0.3];
errorbar(y, e, 'o-');

Animações e Gráficos Interativos

Animações atualizam dados do gráfico dentro de um loop e chamam drawnow para atualizar. Para desempenho suave, crie o gráfico uma vez e atualize XData/YData em vez de replotar. getframe captura a figura atual; movie reproduz uma sequência. VideoWriter exporta para MP4 ou AVI — útil para compartilhar resultados. Sempre defina os limites dos eixos fora do loop para evitar tremores de redimensionamento automático.

matlab
% animated line plot
figure;
h = plot(NaN, NaN);
axis([0 10 -1 1]); xlabel('t'); ylabel('y');
for t = 0:0.1:10
    set(h, 'XData', [get(h,'XData') t], ...
           'YData', [get(h,'YData') sin(t)]);
    drawnow;
end

% getframe to capture animation
frames = [];
for k = 1:50
    plot(sin(linspace(0, k*pi/10, 200)));
    axis([0 200 -1 1]);
    frames = [frames, getframe];
end
movie(frames, 1, 30);   % play once at 30 fps

% write to video file
v = VideoWriter('anim.mp4', 'MPEG-4');
v.FrameRate = 30; open(v);
for k = 1:50
    plot(sin(linspace(0, k*pi/10, 200)));
    writeVideo(v, getframe);
end
close(v);

Objetos de Gráficos e Personalização de Handle

Os gráficos do MATLAB são construídos sobre uma árvore de objetos handle (figure → axes → lines, text, patches). set/get modificam propriedades; findobj localiza objetos por propriedade. A opção 'Interpreter' habilita renderização TeX ou LaTeX completa para notação matemática. exportgraphics (R2020a+) produz PDFs vetoriais de qualidade de publicação com caixas delimitadoras justas — muito melhor que o antigo print para incorporar em artigos.

matlab
% everything in MATLAB graphics is a handle object
h = plot(1:10, 'r-');
set(h, 'LineWidth', 3, 'Marker', 'o', 'MarkerSize', 8);
get(h, 'Color')         % returns [1 0 0]

% find objects
ax = gca;               % current axes
fig = gcf;              % current figure
lines = findobj(ax, 'Type', 'line');

% property exploration
get(ax)                 % list all axes properties
set(ax)                 % list possible values

% text annotations with LaTeX
text(2, 0.5, '\alpha^2 + \beta^2', 'Interpreter', 'tex');
title('$\int_0^1 x^2 dx$', 'Interpreter', 'latex');

% legend with custom location and orientation
legend({'data1','data2'}, 'Location','northwest','Orientation','horizontal');

% export with tight bounding box
exportgraphics(gcf, 'fig.pdf', 'ContentType','vector');
12

GUI e App Designer

Básico do App Designer

App Designer (iniciado com appdesigner) é a ferramenta visual moderna para construir GUIs do MATLAB, salvando arquivos .mlapp que agrupam layout e código. Para UIs programáticas, uifigure (R2014b+) cria janelas de figura modernas com uibutton, uilabel, uieditfield, uislider, uidropdown e uiaxes. Callbacks são function handles atribuídos a propriedades como ButtonPushedFcn. O antigo GUIDE está obsoleto; novo código deve usar componentes baseados em uifigure ou o App Designer.

matlab
% App Designer (appdesigner command) creates .mlapp files
% Modern replacement for GUIDE (deprecated in R2020a)

% programmatic UI (alternative to App Designer)
f = uifigure('Name', 'My App', 'Position', [100 100 600 400]);

% add components
btn = uibutton(f, 'Text', 'Click Me', ...
    'Position', [50 300 100 30]);
lbl = uilabel(f, 'Text', 'Hello', ...
    'Position', [50 250 200 30]);
fld = uieditfield(f, 'text', 'Position', [50 200 200 30]);

% slider and drop-down
sld = uislider(f, 'Position', [50 150 200 3]);
dd = uidropdown(f, 'Items', {'A','B','C'}, ...
    'Position', [50 100 100 30]);

% axes for plotting
ax = uiaxes(f, 'Position', [300 100 250 250]);
plot(ax, 1:10, rand(1,10));

% callback
btn.ButtonPushedFcn = @(src,event) clickHandler(lbl);

function clickHandler(lbl)
    lbl.Text = ['Clicked at ' datestr(now)];
end

Gerenciadores de Layout e Contêineres

uigridlayout (R2018b+) é o gerenciador de layout responsivo moderno — linhas e colunas podem ser fixas, proporcionais ('1x') ou ajustar ao conteúdo. uitabgroup/uitab criam interfaces com abas. uipanel agrupa componentes relacionados visualmente. uiscrollbox adiciona rolagem para conteúdo que excede a janela. Funções de diálogo (uigetfile, inputdlg, msgbox, questdlg) lidam com seleção de arquivos, entrada e notificações padrão. Essas ferramentas de layout são essenciais para construir aplicativos MATLAB profissionais e redimensionáveis.

matlab
f = uifigure;

% grid layout (responsive)
g = uigridlayout(f, [3 2]);
g.RowHeight = {'1x', '2x', '1x'};
g.ColumnWidth = {'1x', '2x'};

btn1 = uibutton(g); btn1.Layout.Row = 1; btn1.Layout.Column = 1;
btn2 = uibutton(g); btn2.Layout.Row = 1; btn2.Layout.Column = 2;

% tab group
tg = uitabgroup(f);
t1 = uitab(tg, 'Title', 'Plot');
t2 = uitab(tg, 'Title', 'Data');
ax = uiaxes(t1); plot(ax, rand(5));

% panel for grouping
p = uipanel(f, 'Title', 'Settings', 'Position', [20 20 200 150]);

% scrollable container for long content
sf = uiscrollbox(f);
% add many components inside sf

% dialog windows
uigetfile('*.mat', 'Select MAT file');
inputdlg({'Name','Age'}, 'Enter data');
msgbox('Operation complete');

Callbacks e Tratamento de Eventos

MATLAB moderno usa callbacks de function handle com dois argumentos (src, event) onde event carrega dados estruturados como event.Value ou event.Key. ValueChangingFcn dispara continuamente durante a interação; ValueChangedFcn dispara uma vez no final. addlistener cria listeners persistentes em qualquer propriedade. Objetos timer executam callbacks em um cronograma — úteis para UIs de aquisição de dados ao vivo. Sempre limpe listeners e timers (delete) para evitar vazamentos de memória.

matlab
% value-changing callback (slider)
sld = uislider(f);
sld.ValueChangingFcn = @(src,event) onSlider(src, event);

function onSlider(src, event)
    disp(['Dragging: ' num2str(event.Value)]);
end

% value-changed callback (final value)
sld.ValueChangedFcn = @(src,event) disp(['Final: ' num2str(event.Value)]);

% button callback with event data
btn.ButtonPushedFcn = @onButton;
function onButton(src, event)
    fprintf('Button %s pushed
', src.Text);
end

% keyboard callback on figure
f.WindowKeyPressFcn = @(src,event) onKey(event);
function onKey(event)
    fprintf('Key: %s
', event.Key);
end

% listener pattern (any property change)
lh = addlistener(btn, 'Text', 'PostSet', @(src,event) disp('Text changed'));
delete(lh);  % remove listener

% timer for periodic updates
t = timer('ExecutionMode','fixedRate','Period',1, ...
    'TimerFcn',@(~,~) disp('tick'));
start(t);

Empacotando Aplicativos para Distribuição

matlab.apputil.package empacota um app do App Designer em um arquivo .mlappinstall que os usuários instalam via a aba Apps. O Application Compiler (deploytool) produz executáveis standalone (.exe) que executam com o MATLAB Runtime gratuito — sem necessidade de licença do MATLAB no alvo. Web Apps (R2020a+) são implantados em um MATLAB Web App Server e executam em qualquer navegador. Esse fluxo de distribuição permite compartilhar aplicativos MATLAB com usuários não-MATLAB.

matlab
% package an App Designer app as a .mlappinstall file
% using the Application Compiler (deploytool app)

% programmatically create a packaged app
appFile = matlab.apputil.package(...
    'Name', 'MyPlotTool', ...
    'Summary', 'A simple plotting utility', ...
    'Description', 'Plots user-supplied data.', ...
    'MainFile', 'MyPlotTool.mlapp', ...
    'FolderPath', 'my_app_package');

% install the app
matlab.apputil.install('MyPlotTool.mlappinstall');

% list installed apps
apps = matlab.apputil.getInstalledApps;

% uninstall
matlab.apputil.uninstall('MyPlotTool');

% standalone desktop app (MATLAB Runtime required)
% deploytool -> Application Compiler -> produce .exe

% web app (runs in browser, MATLAB Web App Server)
% deploytool -> Web App

Padrões Comuns de UI

drawnow limitrate atualiza gráficos sem bloquear — crítico para exibições de dados ao vivo. uitable exibe dados tabulares com colunas classificáveis. uiprogressdlg mostra uma barra de progresso modal para operações longas. uicontextmenu adiciona menus de clique direito a qualquer componente. Esses padrões cobrem as necessidades mais comuns de UI: atualizações ao vivo, tabelas de dados, feedback de progresso e ações contextuais. Para gráficos ao vivo de alto rendimento, considere animatedline que é otimizado para dados de streaming.

matlab
% live plot update from worker
f = uifigure; ax = uiaxes(f); h = plot(ax, NaN, NaN);
for k = 1:100
    set(h, 'XData', 1:k, 'YData', rand(1,k));
    drawnow limitrate;  % throttle for performance
end

% table display
tdata = table({'A';'B';'C'}, [1;2;3], 'VariableNames', {'Name','Val'});
uit = uitable(f, 'Data', tdata.Variables, ...
    'ColumnName', tdata.Properties.VariableNames, ...
    'Position', [20 20 200 150]);

% progress dialog
d = uiprogressdlg(f, 'Title', 'Working', 'Message', 'Processing...');
for k = 1:100
    pause(0.01);
    d.Value = k;
    d.Message = sprintf('%d%% complete', k);
end
close(d);

% context menu
cm = uicontextmenu(f);
m1 = uimenu(cm, 'Text', 'Reset', 'MenuSelectedFcn', @reset);
ax.UIContextMenu = cm;
13

Image Processing Toolbox

Lendo, Escrevendo e Exibindo Imagens

imread suporta PNG, JPEG, TIFF, BMP e muitos formatos científicos. Os tipos de dados de imagem importam: uint8 (0-255) é comum para arquivos, double (0-1) para processamento. Sempre use im2double/im2uint8 (que redimensionam) em vez de double()/uint8() (que truncam). im2gray (R2020b+) substitui rgb2gray. imwrite suporta opções específicas de formato como qualidade JPEG. imfinfo lê metadados sem carregar dados de pixel.

matlab
% read and display an image
img = imread('peppers.png');
imshow(img);
title('RGB image');

% image types
% uint8 (0-255), uint16, double (0-1), logical (binary)
whos img
class(img)              % uint8
size(img)               % rows x cols x channels

% convert between types
d = im2double(img);     % scale to [0,1]
u = im2uint8(d);        % scale to [0,255]
g = im2gray(img);       % RGB to grayscale (R2020b+, replaces rgb2gray)

% write to file
imwrite(g, 'gray.png');
imwrite(g, 'gray.jpg', 'Quality', 90);

% info without loading
info = imfinfo('peppers.png');
disp(info.Width);

% montage of multiple images
fileList = dir('*.png');
montage({fileList.name});

Filtragem e Aprimoramento

imgaussfilt é o desfoque Gaussiano moderno (substitui fspecial('gaussian') + imfilter). medfilt2 remove ruído sal-e-pimenta sem desfocar bordas. fspecial cria kernels predefinidos (sobel, prewitt, laplacian, gaussian). imsharpen aprimora bordas via mascaramento unsharp. histeq realiza equalização global de histograma; adapthisteq (CLAHE) faz localmente para melhor contraste em imagens não uniformes. imadjust mapeia intervalos de intensidade para correção de brilho/contraste.

matlab
img = im2double(imread('cameraman.tif'));

% Gaussian blur
h = imgaussfilt(img, 2);   % sigma = 2
h2 = imgaussfilt(img, [3 3], 1.5);

% median filter (salt-and-pepper noise)
noisy = imnoise(img, 'salt & pepper', 0.05);
m = medfilt2(noisy, [3 3]);

% custom 2D filter
kernel = fspecial('sobel');
edge_img = imfilter(img, kernel);

% unsharp masking (sharpen)
sharp = imsharpen(img, 'Amount', 0.8, 'Radius', 1.5);

% histogram equalization
eq = histeq(img);          % global
eq2 = adapthisteq(img);    % CLAHE (local)

% image arithmetic
bright = imadd(img, 0.1);
contrast = imadjust(img, [0.3 0.7], []);

Operações Morfológicas e Segmentação

Operações morfológicas (erode, dilate, open, close) processam imagens binárias usando elementos estruturantes (strel). Opening remove pequenos objetos; closing preenche pequenos buracos. bwconncomp encontra regiões conectadas; regionprops extrai medidas (área, centróide, caixa delimitadora) para cada uma. watershed segmenta objetos em toque. edge detecta bordas (Canny é a mais robusta). graythresh calcula o limiar global de Otsu; multithresh faz multinível. Essas ferramentas formam o núcleo do pré-processamento de visão computacional.

matlab
bw = imread('text.png');
bw = imbinarize(bw);

% morphological operations
se = strel('disk', 3);
er = imerode(bw, se);       % shrink objects
di = imdilate(bw, se);      % grow objects
op = imopen(bw, se);        % erode then dilate (removes small noise)
cl = imclose(bw, se);       % dilate then erode (fills small holes)

% connected components
cc = bwconncomp(bw);
stats = regionprops(cc, 'Area', 'Centroid', 'BoundingBox');
[areas, idx] = sort([stats.Area], 'descend');

% watershed segmentation
grad = imgradient(bw);
D = -bwdist(~bw);
L = watershed(D);

% edge detection
edges = edge(bw, 'canny');
edges2 = edge(bw, 'sobel');

% thresholding
T = graythresh(img);        % Otsu's method
bw2 = imbinarize(img, T);

Detecção de Características e Transformadas

A detecção de características encontra pontos distintos para correspondência e rastreamento. Cantos Harris são rápidos, mas não invariantes a escala; SURF e ORB são invariantes a escala/rotação para correspondência robusta entre visões. extractFeatures calcula descritores em pontos detectados. A transformada de Hough detecta linhas (e círculos) via votação no espaço de parâmetros — útil para correção de inclinação de documentos e detecção de faixas. imregtform realiza registro de imagem baseado em intensidade, calculando a transformação geométrica que alinha duas imagens.

matlab
img = imread('cameraman.tif');

% corner detection (Harris)
corners = detectHarrisFeatures(img);
[~, strength] = corners;
imshow(img); hold on; plot(corners);

% SURF features (scale-invariant)
points = detectSURFFeatures(img);
[f1, vpts1] = extractFeatures(img, points);

% ORB features (faster, binary)
points = detectORBFeatures(img);

% Hough transform for line detection
bw = edge(img, 'canny');
[H, T, R] = hough(bw);
P = houghpeaks(H, 5);
lines = houghlines(bw, T, R, P);

% image registration
% (find transform between two images)
moving = imread('rotated.png');
fixed = img;
[optimizer, metric] = imregconfig('monomodal');
tform = imregtform(moving, fixed, 'affine', optimizer, metric);
registered = imwarp(moving, tform);

Processamento em Lote e Imagens Grandes

Para processamento em lote, parfor paraleliza entre imagens. blockproc processa imagens grandes em mosaicos — essencial quando a imagem inteira não cabe na memória; a opção 'Destination' transmite a saída para o disco. imageDatastore gerencia coleções grandes demais para enumerar manualmente e integra com tall arrays e o framework MapReduce para computação out-of-core. O suporte bigTIFF lida com microscopia gigapixel e imagens de sensoriamento remoto.

matlab
% process many images in a folder
fileList = dir('*.tif');
parfor k = 1:numel(fileList)
    img = imread(fileList(k).name);
    result = processImage(img);
    imwrite(result, ['out_' fileList(k).name]);
end

% block processing for large images
fun = @(block) std2(block);
B = blockproc('large.tif', [256 256], fun);
B = blockproc('large.tif', [256 256], fun, 'Destination', 'out.tif');

% work with very tall/wide images without loading all
% (bigTIFF, multiresolution)
t = Tiff('big.tif', 'r');
imgInfo = t.getImageInfo;

% image datastore for huge collections
imds = imageDatastore('images/', 'IncludeSubfolders', true);
imds.ReadSize = 10;  % read 10 at a time
while hasdata(imds)
    [imgs, info] = read(imds);
    % process batch
end

% tall arrays (out-of-core) for pixel statistics
t = tall(imds);
14

Optimization Toolbox

Otimização Sem e Com Restrições

fminunc resolve problemas suaves sem restrições; fmincon lida com limites, restrições lineares e não lineares. linprog e quadprog são especializados para objetivos lineares e quadráticos com restrições lineares — muito mais rápidos que solvers gerais. optimoptions configura o comportamento do solver (algoritmo, tolerâncias, exibição). O algoritmo 'interior-point' é robusto para problemas grandes; 'sqp' é bom para restrições não lineares. Sempre forneça gradientes analíticos quando disponíveis para velocidade e precisão.

matlab
% unconstrained minimization
f = @(x) (x(1)-2)^2 + (x(2)-3)^2;
x0 = [0 0];
[x, fval] = fminunc(f, x0);

% constrained (with fmincon)
A = []; b = []; Aeq = []; beq = [];
lb = [0 0]; ub = [];
nonlcon = @(x) deal([], x(1) + x(2) - 4);  % x1+x2 <= 4
[x, fval] = fmincon(f, x0, A, b, Aeq, beq, lb, ub, nonlcon);

% linear programming
f_lp = [-1 -1];            % minimize -x1 - x2
A_lp = [1 1; -1 1]; b_lp = [4; 2];
[x, fval] = linprog(f_lp, A_lp, b_lp, [], [], [0;0]);

% quadratic programming
H = [1 -1; -1 2]; c = [-2; -6];
[x, fval] = quadprog(H, c, [], [], [], [], [0;0]);

% set optimization options
opts = optimoptions('fmincon', 'Algorithm','interior-point', ...
    'Display','iter', 'MaxIterations', 200);
[x, fval] = fmincon(f, x0, A, b, Aeq, beq, lb, ub, nonlcon, opts);

Otimização Global e Multiobjetivo

Solvers locais (fminunc, fmincon) podem ficar presos em mínimos locais. GlobalSearch e MultiStart executam um solver local a partir de muitos pontos iniciais. ga (algoritmo genético), particleswarm e simulannealbnd são métodos globais sem derivadas — mais lentos, mas funcionam em objetivos descontínuos ou ruidosos. gamultiobj encontra a frente de Pareto para problemas multiobjetivo, retornando um conjunto de soluções não dominadas. Escolha com base na suavidade do problema, dimensionalidade e se você precisa de garantias de otimalidade global.

matlab
% GlobalSearch / MultiStart for non-convex problems
f = @(x) x(1)^2 + x(2)^2 + 10*sin(x(1)) + 10*sin(x(2));
opts = optimoptions('fmincon', 'Algorithm','sqp');
problem = createOptimProblem('fmincon','objective',f, ...
    'x0',[0 0],'lb',[-5 -5],'ub',[5 5],'options',opts);
gs = GlobalSearch;
[x, fval] = run(gs, problem);

% genetic algorithm
[x, fval] = ga(f, 2, [], [], [], [], [-5 -5], [5 5]);

% particle swarm
[x, fval] = particleswarm(f, 2, [-5 -5], [5 5]);

% simulated annealing
[x, fval] = simulannealbnd(f, [0 0], [-5 -5], [5 5]);

% multiobjective (Pareto front)
f_multi = @(x) [x(1)^2 + x(2)^2, (x(1)-1)^2 + (x(2)-1)^2];
[x, fval] = gamultiobj(f_multi, 2, [], [], [], [], [-2 -2], [2 2]);
plot(fval(:,1), fval(:,2), 'o');

Ajuste de Curvas e Estimação de Parâmetros

fittype define modelos paramétricos personalizados; fit realiza a regressão com heurísticas automáticas de ponto inicial. lsqcurvefit é o solver de mínimos quadrados não lineares de nível inferior — útil quando você precisa de controle fino ou Jacobianos personalizados. confint e predint retornam intervalos de confiança e previsão para quantificação de incerteza. O app Curve Fitter (cftool) fornece uma interface interativa para explorar ajustes. Sempre verifique os resíduos quanto a estrutura sistemática que sugere especificação incorreta do modelo.

matlab
% fit a custom model to data
x = linspace(0, 5, 50);
y = 2*exp(-0.5*x) + 0.1*randn(size(x));

% define model and fit
model = fittype('a*exp(-b*x)', 'independent', 'x', ...
    'coefficients', {'a','b'});
f = fit(x', y', model, 'StartPoint', [1 1]);
plot(f, x, y);

% predefined models
f2 = fit(x', y', 'exp2');     % two-term exponential
f3 = fit(x', y', 'poly2');    % quadratic polynomial

% nonlinear least squares with lsqcurvefit
fun = @(p, xdata) p(1)*exp(-p(2)*xdata);
[p, resnorm] = lsqcurvefit(fun, [1 1], x, y);

% confidence intervals
ci = confint(f, 0.95);
predint(f, x', 0.95, 'observation', 'functional');

% smoothing spline
sf = fit(x', y', 'smoothingspline');

Otimização Inteira e Combinatória

intlinprog resolve programas lineares de inteiros mistos — o padrão para problemas de escalonamento, roteamento e atribuição. matchpairs resolve o problema de atribuição de forma ótima em O(n^3). O problema do caixeiro viajante requer eliminação iterativa de subcaminhos, já que o conjunto de restrições é exponencial. surrogateopt é para funções caixa-preta caras (por exemplo, simulações levando minutos por avaliação) — ele constrói um modelo substituto e amostra inteligentemente. Para problemas combinatórios grandes demais para métodos exatos, considere ga ou heurísticas personalizadas.

matlab
% mixed-integer linear programming (TSP-like problems)
f = [-3 -2];             % maximize 3x + 2y
A = [1 1; 2 1]; b = [4; 6];
intcon = 1:2;            % both variables integer
[x, fval] = intlinprog(f, intcon, A, b, [], [], [0;0]);

% assignment problem (Hungarian algorithm)
cost = [4 1 3; 2 3 4; 3 4 1];
[assignment, cost_total] = matchpairs(cost, false);

% traveling salesman via intlinprog
n = 8;  % cities
distances = rand(n, n); distances = distances + distances';
% (build subtour elimination constraints iteratively)

% knapsack
weights = [2 3 4 5]; values = [3 4 5 6];
W = 5;
f = -values;
A = weights; b = W;
intcon = 1:4;
[x, fval] = intlinprog(f, intcon, A, b, [], [], zeros(4,1), ones(4,1));

% surrogate optimization (expensive black-box)
obj = @(x) expensive_eval(x);
[x, fval] = surrogateopt(obj, lb, ub);

Fluxo de Trabalho de Otimização e Melhores Práticas

Escolher o solver certo é a decisão mais importante — usar fmincon em um programa linear desperdiça ordens de magnitude em desempenho. Fornecer gradientes analíticos (via o framework baseado em problemas ou optimoptions) melhora drasticamente a velocidade e confiabilidade. Escalar variáveis para a ordem de 1 melhora o condicionamento. Verifique exitflag e firstorderopt para confirmar convergência. O framework baseado em problemas (optimproblem, optimvar) é mais legível e permite que o MATLAB selecione o solver automaticamente — preferido para novo código.

matlab
% 1. choose solver based on problem type
%    smooth? -> fminunc/fmincon
%    linear? -> linprog/intlinprog
%    integer? -> intlinprog
%    nonsmooth/global? -> ga/particleswarm/GlobalSearch

% 2. provide gradients and Jacobians when possible
f = @(x) x(1)^2 + x(2)^2;
gradf = @(x) [2*x(1); 2*x(2)];
prob = optimproblem('Objective', f);
prob.Objective.Gradient = gradf;

% 3. scale variables to ~[1, 1]
x_scaled = (x - x0) / scale;

% 4. check optimality and feasibility
output.exitflag       % 1 = converged
output.firstorderopt  % should be near 0

% 5. warm start sequential problems
opts = optimoptions('quadprog','ObjectiveLimit',1e-8);
x_new = quadprog(H, c, A, b, [], [], lb, ub, x_old, opts);

% 6. use problem-based framework (cleaner)
x = optimvar('x', 2, 'LowerBound', 0);
prob = optimproblem('Objective', x(1)^2 + x(2)^2);
prob.Constraints.c1 = x(1) + x(2) >= 1;
sol = solve(prob);
15

Computação Paralela

Loops parfor e Pools Paralelos

parfor é o caminho mais fácil para o paralelismo — distribui iterações de loop entre workers. As iterações devem ser independentes (nenhuma iteração k dependendo de k-1). Variáveis são classificadas: variáveis de loop (k), fatiadas (indexadas por k apenas na primeira/última dimensão), broadcast (somente leitura) e redução (combinadas com operação associativa como + ou *). A sobrecarga de comunicação significa que parfor ajuda apenas quando cada iteração faz trabalho substancial. Inicie o pool uma vez; reutilize-o entre loops parfor para evitar custo de inicialização.

matlab
% start a parallel pool (workers = CPU cores)
pool = gcp('nocreate');
if isempty(pool)
    parpool;  % start default pool
end

% parfor: parallel for loop
n = 1e6;
results = zeros(1, n);
parfor k = 1:n
    results(k) = expensive_computation(k);
end

% restrictions:
% - iterations must be independent (no data dependencies)
% - variables classified as loop, sliced, broadcast, reduction
% - cannot break/continue

% reduction variables (combine results)
total = 0;
parfor k = 1:n
    total = total + compute(k);
end

% sliced variables (each iteration writes distinct element)
out = zeros(n, 1);
parfor k = 1:n
    out(k) = k^2;
end

% control pool size
delete(gcp('nocreate'));  % shut down
parpool('local', 4);      % 4 workers

spmd e Arrays Distribuídos

spmd executa o mesmo código em todos os workers com labidx identificando cada um — útil para algoritmos paralelos de dados onde cada worker processa um pedaço. Variáveis Composite (A{1}, A{2}) contêm resultados por worker. Arrays distribuídos espalham um único array lógico entre workers; localpart fornece o pedaço local. labSendrecv e gcat/gplus permitem comunicação entre workers. Use spmd para paralelismo fino que parfor não consegue expressar (por exemplo, algoritmos iterativos que precisam de comunicação).

matlab
% spmd: single program, multiple data
spmd
    labidx              % worker index (1 to n)
    numlabs             % total workers
    A = rand(1000) * labidx;
    % each lab has its own A
end

% access Composite (per-worker data)
A{1}                    % A from worker 1
A{2}                    % A from worker 2

% distributed arrays (spread across workers)
D = distributed.rand(10000);
size(D)                 % 10000x10000 total
L = localpart(D);       % this worker's chunk

% communicate between labs
spmd
    data = rand(100, 1);
    % send to next lab, receive from previous
    next_lab = mod(labidx, numlabs) + 1;
    prev_lab = mod(labidx - 2, numlabs) + 1;
    rcvd = labSendrecv(data, next_lab, prev_lab);
end

% gather distributed to local
D = distributed.rand(1000);
full_matrix = gather(D);

Computação em GPU

gpuArray transfere dados para a GPU; operações subsequentes executam lá e permanecem na GPU até gather() trazer os resultados de volta. A maioria das funções elemento a elemento e de álgebra linear são habilitadas para GPU. arrayfun executa funções personalizadas elemento a elemento na GPU (mas apenas com operações escalares). Para sistemas multi-GPU, atribua a cada worker parfor uma GPU diferente via gpuDevice(k). A computação em GPU se destaca em álgebra linear densa grande e operações elemento a elemento; a sobrecarga de transferência de dados torna ineficiente para arrays pequenos.

matlab
% move data to GPU
A = gpuArray(rand(10000));
B = gpuArray(eye(10000));

% operations execute on GPU
C = A * B;              % GPU matrix multiply
D = A + B;
E = sum(A, 1);

% gather results back to CPU
C_cpu = gather(C);

% many built-in functions are GPU-enabled
x = gpuArray.linspace(-10, 10, 1e6);
y = sin(x) .* exp(-x.^2);

% arrayfun on GPU (custom element-wise functions)
f = @(a, b) a.^2 + b.^2;
result = arrayfun(f, A, B);

% check GPU
gpuDevice            % info about current GPU
gpuDeviceCount       % number of available GPUs

% page multiple GPUs
parfor k = 1:4
    gpuDevice(k);
    A = gpuArray(rand(5000));
    % ... compute on GPU k
end

batch e agendamento de jobs

batch executa uma função de forma assíncrona em segundo plano — útil para computações longas que você não quer bloquear a sessão. batch com a opção 'Pool' executa uma função que por si usa parfor. A API de job/task de nível inferior dá controle fino sobre o agendamento. parcluster seleciona um perfil de cluster; o MATLAB integra com SLURM, PBS e LSF via a interface de scheduler genérico do Parallel Computing Toolbox. Para HPC, salve dados em arquivos e envie scripts em vez de depender de memória compartilhada.

matlab
% run a function in background
job = batch(@my_function, 0, {arg1, arg2});

% check status
job.State              % 'queued', 'running', 'finished'
wait(job);             % block until done
load(job);             % retrieve results

% batch with parfor inside
job = batch(@my_parfor_func, 1, {input_data}, 'Pool', 4);

% job and task objects (lower-level)
job = createJob(pool);
task = createTask(job, @my_func, 1, {arg1});
submit(job);
wait(job);
result = fetchOutputs(task);

% cluster types
% 'local' - on this machine
% 'MJS' - MATLAB Job Scheduler (server cluster)
% 'SLURM'/'PBS' - HPC scheduler integration
c = parcluster('local');
c.NumWorkers = 8;
c.saveProfile;

Desempenho e Profiling de Código Paralelo

Profile código paralelo com profile on -parallel para ver cronogramas por worker. A aceleração é limitada pela lei de Amdahl: se 10% do código é serial, a aceleração máxima é 10x, independentemente do número de workers. Armadilhas comuns: iterações muito pequenas (sobrecarga excede o trabalho), variáveis de broadcast grandes (custo de transferência) e operações de redução excessivas. parallel.pool.DataQueue habilita atualizações de progresso ao vivo dos workers sem bloqueio — útil para monitorar jobs paralelos longos. Sempre meça antes e depois para verificar se o paralelismo realmente ajuda.

matlab
% profile parallel code
profile on -parallel
parfor k = 1:100
    compute(k);
end
profile off
profview                % visualize

% measure speedup
tic;
serial_result = serial_compute();
t_serial = toc;

tic;
parfor_result = parallel_compute();
t_parallel = toc;

speedup = t_serial / t_parallel;
fprintf('Speedup: %.2fx using %d workers
', speedup, pool.NumWorkers);

% avoid common pitfalls:
% 1. too little work per iteration (overhead dominates)
% 2. large broadcast variables (transfer cost)
% 3. false sharing via reduction variables

% data queue for live updates from workers
Q = parallel.pool.DataQueue;
afterEach(Q, @update_plot);
parfor k = 1:n
    % ... compute ...
    send(Q, partial_result);
end
16

Programação Orientada a Objetos

Classes e Propriedades

Classes do MATLAB vivem em arquivos chamados ClassName.m. O bloco classdef contém propriedades e métodos. Atributos de propriedade controlam o acesso: SetAccess=protected significa que apenas métodos da classe podem escrever; Constant define constantes de nível de classe. O construtor é um método com o nome da classe. O MATLAB usa semântica de valor por padrão (objetos são copiados na atribuição) — use classes handle para semântica de referência. Métodos sobrecarregados como disp personalizam o comportamento padrão.

matlab
% class definition in a file named Point.m
classdef Point
    properties
        x = 0       % public, with default
        y = 0
    end
    properties (SetAccess = protected)
        id          % settable only by class methods
    end
    properties (Constant)
        PI = 3.14159
    end

    methods
        function obj = Point(x, y)
            if nargin > 0
                obj.x = x;
                obj.y = y;
            end
            obj.id = randi(1e6);
        end

        function r = distance(obj)
            r = sqrt(obj.x^2 + obj.y^2);
        end

        function disp(obj)
            fprintf('Point(%.2f, %.2f) [id=%d]
', ...
                obj.x, obj.y, obj.id);
        end
    end
end

% usage
p = Point(3, 4);
p.distance()           % 5
disp(p)

Classes Handle vs Valor

A escolha entre classes de valor e handle é fundamental. Classes de valor (padrão) copiam na atribuição e em chamadas de método — mais seguras para dados imutáveis. Classes handle (subclasse handle) são referências: atribuições e cópias apontam para o mesmo objeto, como objetos em Java/Python. Classes handle são necessárias para coisas como componentes de GUI, handles de arquivo e estado mutável compartilhado entre chamadores. Use classes de valor para objetos matemáticos (vetores, matrizes) onde a imutabilidade é desejável.

matlab
% value class (default): copies on assignment
classdef Vec
    properties
        data
    end
    methods
        function obj = Vec(d)
            obj.data = d;
        end
    end
end

v1 = Vec([1 2 3]);
v2 = v1;             % COPY
v2.data = [4 5 6];
disp(v1.data)        % still [1 2 3]

% handle class: references shared
classdef HVec < handle
    properties
        data
    end
    methods
        function obj = HVec(d)
            obj.data = d;
        end
    end
end

h1 = HVec([1 2 3]);
h2 = h1;             % REFERENCE (same object)
h2.data = [4 5 6];
disp(h1.data)        % [4 5 6] - changed!

% handle classes support delete method
% isequal(h1, h2) -> true (same object)

Herança e Polimorfismo

A herança usa < na linha classdef; obj@SuperClass(args) chama o construtor da superclasse. O MATLAB suporta herança múltipla, mas é rara e pode levar a problemas de diamante. Métodos abstratos (declarados em methods (Abstract)) devem ser implementados por subclasses; a classe base não pode ser instanciada. O polimorfismo funciona naturalmente: chame o método em qualquer objeto e o MATLAB despacha para a implementação correta. Use isa(obj, 'ClassName') e isprop/ismethod para verificações de tipo em tempo de execução.

matlab
% single inheritance
classdef Dog < Animal
    methods
        function obj = Dog(name)
            obj@Animal(name);  % call superclass constructor
        end
        function sound(obj)
            disp([obj.name ' says Woof']);
        end
    end
end

% multiple inheritance
classdef FlyingFish < Fish & Bird
    methods
        function obj = FlyingFish(name)
            obj@Fish(name);
            obj@Bird(name);
        end
    end
end

% abstract methods and classes
classdef Shape
    methods (Abstract)
        area(obj)
        perimeter(obj)
    end
end

classdef Circle < Shape
    properties
        radius
    end
    methods
        function obj = Circle(r)
            obj.radius = r;
        end
        function a = area(obj)
            a = pi * obj.radius^2;
        end
        function p = perimeter(obj)
            p = 2 * pi * obj.radius;
        end
    end
end

% polymorphism
shapes = {Circle(2), Square(3)};
for k = 1:numel(shapes)
    fprintf('Area: %.2f
', shapes{k}.area());
end

Eventos e Listeners

O modelo de eventos implementa o padrão observer: classes declaram eventos, listeners registram callbacks e notify dispara eventos. Isso desacopa produtores de consumidores — essencial para GUIs, simulações e sistemas reativos. Métodos set de propriedade (set.PropertyName) interceptam atribuições e podem acionar eventos. Listeners podem ser temporários (addlistener, vinculados ao tempo de vida do objeto) ou persistentes (objeto listener mantido em uma variável). Sempre exclua listeners quando terminar para evitar vazamentos de memória.

matlab
classdef TemperatureSensor < handle
    properties
        Temperature = 20
    end
    events
        TemperatureChanged
        Overheated
    end
    methods
        function set.Temperature(obj, t)
            obj.Temperature = t;
            notify(obj, 'TemperatureChanged');
            if t > 100
                notify(obj, 'Overheated');
            end
        end
        function obj = TemperatureSensor()
            % nothing
        end
    end
end

% create sensor and listen
s = TemperatureSensor();
addlistener(s, 'TemperatureChanged', @onTempChanged);
addlistener(s, 'Overheated', @onOverheat);

function onTempChanged(src, event)
    fprintf('Temp now: %.1f
', src.Temperature);
end

function onOverheat(src, event)
    warning('Overheated at %.1f!', src.Temperature);
end

% trigger
s.Temperature = 25;     % prints "Temp now: 25.0"
s.Temperature = 105;    % prints temp + warning

Sobrecarga de Operadores e Indexação

A sobrecarga de operadores permite que classes do usuário funcionem com +, *, [], etc. Cada operador mapeia para uma função (plus, mtimes, minus, mrdivide, horzcat, vertcat). subsref e subsasgn personalizam a indexação (obj(i), obj.field, obj{i}). O MATLAB moderno prefere notação de ponto para acesso a propriedades, mas subsref/subsasgn ainda são necessários para padrões de falsa indexação (por exemplo, uma biblioteca de tensores onde T(1,2,3) extrai um elemento). Sobrecarregue disp para saída legível e end/numel para semântica de indexação personalizada.

matlab
classdef Complex
    properties
        re
        im
    end
    methods
        function obj = Complex(re, im)
            obj.re = re; obj.im = im;
        end
        function r = plus(a, b)            % a + b
            r = Complex(a.re + b.re, a.im + b.im);
        end
        function r = mtimes(a, b)          % a * b
            r = Complex(a.re*b.re - a.im*b.im, ...
                        a.re*b.im + a.im*b.re);
        end
        function r = abs(obj)              % |obj|
            r = sqrt(obj.re^2 + obj.im^2);
        end
        function disp(obj)
            fprintf('%.2f %+.2fi
', obj.re, obj.im);
        end
    end
    methods
        function r = subsref(obj, S)       % obj(...)
            if strcmp(S(1).type, '()')
                r = obj.re + 1i*obj.im;
            end
        end
        function obj = subsasgn(obj, S, val)  % obj(...) = val
            % custom assignment
        end
    end
end

c1 = Complex(1, 2); c2 = Complex(3, 4);
c3 = c1 + c2;          % uses plus
c4 = c1 * c2;          % uses mtimes
abs(c1)                % uses abs
17

Depuração e Ajuste de Desempenho

Depurador e Breakpoints

dbstop define breakpoints — a ferramenta de depuração mais poderosa. Breakpoints condicionais (dbstop ... if condition) pausam apenas quando um predicado é verdadeiro, essencial para encontrar bugs em loops grandes. dbstop if error transforma qualquer exceção não capturada em uma pausa de depuração, permitindo inspecionar o workspace no ponto de falha. O objeto ME (MException) em blocos catch carrega .message, .identifier e .stack para tratamento de erros rico. Use dbstack para navegar na pilha de chamadas e dbup/dbdown para inspecionar workspaces de chamadores.

matlab
% set breakpoints in the Editor or programmatically
dbstop in my_function at 42      % line 42 of my_function.m
dbstop in my_function at 42 if x > 10  % conditional
dbstop if error                  % pause on any error
dbstop if naninf                 % pause on NaN/Inf
dbstop if warning                % pause on warnings
dbclear all                      % clear all breakpoints
dbclear in my_function           % clear in one file

% at a breakpoint, the command window enters debug mode K>>
whos                             % inspect workspace
x                                % view variables
dbstep                           % step to next line
dbstep in                        % step into function
dbstep out                       % step out of function
dbcont                           % continue execution
dbstack                          % show call stack
dbup / dbdown                    % move up/down stack frames
dbquit                           % exit debug mode

% error recovery
try
    risky_operation();
catch ME
    fprintf('Error: %s
', ME.message);
    fprintf('Stack:
');
    for k = 1:numel(ME.stack)
        fprintf('  %s (line %d)
', ME.stack(k).name, ME.stack(k).line);
    end
end

Profiling e Detecção de Hotspots

O profiler (profile on/off + profile viewer) mostra onde o tempo é gasto, linha por linha — a ferramenta mais importante para otimização. Sempre faça profiling antes de otimizar; a intuição sobre gargalos costuma estar errada. timeit é mais preciso que tic/toc para microbenchmarks porque executa a função várias vezes e contabiliza a sobrecarga. A opção -memory rastreia alocações, útil para encontrar vazamentos de memória ou cópia excessiva. Foque o esforço de otimização nas poucas linhas mais quentes para máximo impacto.

matlab
% profile a script or function
profile on
my_expensive_script();
profile off

% view results
profile viewer                 % GUI
p = profile('info');           % structure
profsave(p, 'profile_results'); % HTML report

% time individual operations
tic; A = rand(5000); A = A * A; toc;   % ~0.5s

% timeit for accurate single-function timing
f = @() sort(rand(1e6,1));
t = timeit(f);

% memory profiling
profile on -memory
% ... run code ...
profile viewer   % shows memory allocation

% identify bottlenecks
% 1. profile viewer shows time per function/line
% 2. focus on the top few hottest lines
% 3. vectorize, preallocate, or use MEX for those

Vetorização e Pré-alocação

Os três maiores ganhos de desempenho no MATLAB: (1) pré-alocar arrays antes de preenchê-los em loops (zeros, NaN, cell), (2) vetorizar operações para aproveitar BLAS/LAPACK, e (3) usar padrões amigáveis ao JIT (loops simples agora são rápidos, mas crescer arrays ainda é O(n^2)). A indexação lógica substitui loops if/else por uma única atribuição vetorizada. Evite arrayfun a menos que precise do suporte à GPU — loops pré-alocados simples costumam ser mais rápidos. Meça com tic/toc ou timeit para verificar melhorias.

matlab
% BAD: growing array in loop
tic;
s = [];
for k = 1:100000
    s = [s, k^2];     % reallocates every iteration!
end
toc;                  % ~10 seconds

% GOOD: preallocate
tic;
s = zeros(1, 100000);
for k = 1:100000
    s(k) = k^2;
end
toc;                  % ~0.01 seconds

% BEST: vectorize
tic;
s = (1:100000).^2;
toc;                  % ~0.001 seconds

% vectorize conditional logic
x = rand(10000, 1);
% BAD:
% for k = 1:numel(x)
%     if x(k) > 0.5, y(k) = 1; else, y(k) = 0; end
% end
% GOOD:
y = double(x > 0.5);

% vectorize with logical indexing
y = zeros(size(x));
y(x > 0.5) = 1;
y(x > 0.8) = 2;

% use arrayfun/gpuArray only when truly needed
% (loops with preallocation are often faster than arrayfun)

Arquivos MEX e Integração com C

Arquivos MEX permitem chamar C/C++/Fortran do MATLAB — essencial quando um loop crítico não pode ser vetorizado ou ao envolver bibliotecas existentes. mex compila um arquivo C em um binário .mexw64 (Windows) ou .mexa64 (Linux). A moderna C++ MATLAB Data API (R2018a+) é type-safe e mais limpa que a antiga API mxGetPr/mxCreate. Para chamar MATLAB de aplicativos externos, use a MATLAB Engine API ou o MATLAB Compiler SDK. loadlibrary envolve bibliotecas compartilhadas genéricas sem compilação. Faça profiling primeiro — apenas MEX-ifique o gargalo real.

matlab
% call C/C++/Fortran code from MATLAB via MEX
% write a C file (my_func.c):
/*
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    double *x = mxGetPr(prhs[0]);
    size_t n = mxGetNumberOfElements(prhs[0]);
    plhs[0] = mxCreateDoubleMatrix(n, 1, mxREAL);
    double *y = mxGetPr(plhs[0]);
    for (size_t k = 0; k < n; k++) y[k] = x[k] * x[k];
}
*/

% compile
mex my_func.c           % produces my_func.mexw64
% usage:
y = my_func([1 2 3]);   % [1 4 9]

% C++ with MATLAB Data API (modern, R2018a+)
% #include "mex.hpp", "mexAdapter.hpp"
% use matlab::data::TypedArray<double>

% call MATLAB from C/C++ application (MATLAB Engine API)
% #include "engine.h"
% eng = engOpen("");
% engPutVariable(eng, "x", x);
% engEvalString(eng, "y = sqrt(x)");

% loadlibrary for generic shared libraries
loadlibrary('mylib.dll', 'mylib.h');
calllib('mylib', 'my_function', arg);
unloadlibrary('mylib');

Gerenciamento de Memória e Dados Grandes

A memória costuma ser o gargalo para computações grandes. Use single em vez de double para reduzir a memória pela metade e dobrar a taxa de transferência. Matrizes esparsas armazenam apenas não nulos. memmapfile mapeia um arquivo binário na memória sem carregá-lo — perfeito para conjuntos de dados enormes acessados sequencialmente. tall arrays (com datastore) processam dados em pedaços que não cabem na RAM, usando MapReduce internamente. Desde R2018b, o MATLAB pode fazer algumas operações in-place (A = A + 1) sem copiar, mas A(:) = ... explícito garante isso. Sempre limpe variáveis grandes quando terminar.

matlab
% check memory usage
[usr, sys] = memory;
disp(usr.PhysicalMemory.Available);

% view variable sizes
whos                  % all variables with sizes
[x_size, x_bytes] = compute_size(x);

% clear large variables when done
clear big_array;

% use single precision when possible
A = rand(5000, 'single');   % half the memory of double
B = A * A;                   % single precision matmul

% sparse for mostly-zero matrices
S = sparse(1e5, 1e5);
S(1, 1) = 1;

% memory-mapped files for huge data
m = memmapfile('large.bin', 'Format', 'double', 'Offset', 0, ...
    'Repeat', 1e8);
m.Data(1)              % access without loading all

% tall arrays for out-of-core
ds = datastore('big.csv');
t = tall(ds);
mean_t = mean(t.Var1);
gather(mean_t);        % triggers computation

% avoid copies: in-place operations
A = A + 1;             % may modify A in place (since R2018b)
A(:) = A(:) + 1;       % definitely in place
18

Gráficos Avançados

Subplots e tiledlayout

tiledlayout (R2019b+) é a substituição moderna de subplot — melhor espaçamento, abrangência mais fácil e títulos compartilhados via title(..., 'tiledtitle'). nexttile([1 2]) abrange múltiplos mosaicos. subplot(n, m, k) ainda funciona para código legado, mas é menos flexível.

matlab
% tiledlayout (R2019b+) replaces subplot
tiledlayout(2, 3, 'TileSpacing', 'compact', 'Padding', 'compact');

nexttile; plot(1:10);
nexttile; scatter(rand(1, 50), rand(1, 50));
nexttile; bar(rand(5, 3));
nexttile; imagesc(magic(10));
nexttile; histogram(randn(1000, 1), 30);
nexttile; pie([30 20 50]);

% span multiple tiles
nexttile(7, [1 2]); plot(sin(0:0.1:2*pi));

% shared title and labels
title('Dashboard Demo');
xlabel('X'); ylabel('Y');

% legacy subplot
subplot(2, 2, 1); plot(1:10);
subplot(2, 2, 2); plot(10:-1:1);

Personalizando eixos

A maioria das propriedades dos eixos é acessível via o handle de eixos (gca). xlim/ylim definem limites; xticks/xticklabels controlam posições e rótulos dos ticks. A marcação TeX como \pi renderiza letras gregas. set(gca, ...) é a sintaxe legada; ax.Property = value é o equivalente moderno (R2014b+).

matlab
x = linspace(0, 2*pi, 100);
plot(x, sin(x));

% axis limits
xlim([0 2*pi]); ylim([-1.2 1.2]);

% ticks and labels
xticks(0:pi/2:2*pi);
xticklabels({'0', '\pi/2', '\pi', '3\pi/2', '2\pi'});

% grid and minor grid
grid on; grid minor on;

% axis appearance
box on;
ax = gca;
ax.FontSize = 12;
ax.FontName = 'Courier';
ax.LineWidth = 1.5;
ax.XColor = [0.5 0.5 0.5];
ax.YDir = 'reverse';

% log scale
semilogy(1:100, 2.^(1:100));
set(gca, 'YScale', 'log');

Múltiplos gráficos e legenda

hold on permite sobrepor múltiplos gráficos nos mesmos eixos — sempre finalize com hold off para evitar surpresas. 'Location', 'best' escolhe o canto com menos sobreposição. A opção 'Interpreter', 'latex' habilita matemática LaTeX completa. Passe handles de linha específicos para legend para incluir apenas alguns gráficos.

matlab
x = linspace(0, 2*pi, 100);
y1 = sin(x); y2 = cos(x); y3 = sin(x) + cos(x);

% hold on for multiple lines
plot(x, y1, 'r-', 'LineWidth', 2); hold on;
plot(x, y2, 'b--', 'LineWidth', 2);
plot(x, y3, 'g:', 'LineWidth', 2); hold off;

% legend with location
legend('sin(x)', 'cos(x)', 'sin+cos', ...
       'Location', 'best', 'Orientation', 'horizontal');

% legend with TeX
legend('$\sin(x)$', '$\cos(x)$', 'Interpreter', 'latex');

% specify which lines to include
h1 = plot(x, y1); hold on;
h2 = plot(x, y2);
h3 = plot(x, y3);
legend([h1 h3], 'sin', 'sin+cos');

Gráficos 3D

surf desenha uma superfície colorida; mesh desenha um wireframe. contour e contourf mostram projeções 2D; clabel adiciona rótulos. plot3 desenha curvas paramétricas 3D. view(az, el) define o ângulo da câmera (azimute, elevação em graus). shading interp suaviza transições de cor.

matlab
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);

% surface plot
figure;
surf(X, Y, Z);
colorbar; shading interp;

% mesh plot (wireframe)
figure;
mesh(X, Y, Z);
hidden off;                      % show hidden lines

% contour
figure;
contour(X, Y, Z, 20); colorbar;
contourf(X, Y, Z, 20); colorbar; % filled
[c, h] = contour(X, Y, Z, 20); clabel(c, h);

% 3D parametric
t = 0:0.01:10;
plot3(sin(t), cos(t), t);
xlabel('x'); ylabel('y'); zlabel('z');
view(45, 30);                    % azimuth, elevation

Animações e filmes

Animações atualizam dados do gráfico dentro de um loop com drawnow para atualizar. Para vídeo suave, use VideoWriter (substitui o avifile obsoleto). getframe captura a figura atual como uma imagem. Defina FrameRate antes de abrir o vídeo. Sempre close(v) quando terminar para descarregar o arquivo.

matlab
% animate a sine wave
figure;
h = plot(NaN, NaN);
xlim([0 2*pi]); ylim([-1 1]);

for k = 1:100
  x = linspace(0, 2*pi, k);
  set(h, 'XData', x, 'YData', sin(x));
  drawnow;
end

% capture frames and save as video
v = VideoWriter('animation.mp4', 'MPEG-4');
v.FrameRate = 30; open(v);

for k = 1:60
  plot(sin(0:0.1:k/10));
  frame = getframe(gcf);
  writeVideo(v, frame);
end
close(v);

% getframe for static snapshots
figure; plot(1:10);
frame = getframe;                % struct with cdata
19

Operações de Matriz Aprofundadas

Essenciais de álgebra linear

Sempre use A\b (barra invertida) para resolver sistemas lineares — ele despacha para a fatoração correta (LU, Cholesky, QR) com base na matriz. inv(A)*b é mais lento e numericamente pior. eig retorna autovetores como colunas de V e autovalores na diagonal de D. expm é a matriz exponencial (diferente de exp elemento a elemento).

matlab
A = [1 2; 3 4];
b = [5; 6];

% solve Ax = b
x = A \ b;                       % preferred (LU-based)
x = inv(A) * b;                  % avoid — slower, less stable

% factorizations
[L, U, P] = lu(A);               % PA = LU
[Q, R] = qr(A);                  % A = QR
[V, D] = eig(A);                 % A V = V D
[U, S, V] = svd(A);              % A = U S V'

% properties
det(A); trace(A); rank(A); cond(A);
null(A);                         % null space
orth(A);                         % orthonormal basis of range

% matrix functions
expm(A); logm(A); sqrtm(A);      % matrix (not element-wise)

Operações elemento a elemento vs matriz

O prefixo ponto (.*) significa elemento a elemento; sem ele, as operações são operações de matriz. O bug mais comum do MATLAB: x*x onde x é um vetor linha — use x*x' para produto escalar ou x.*x para quadrado elemento a elemento. ' é transposta conjugada (inverte o sinal das partes imaginárias); .' é transposta simples.

matlab
A = [1 2; 3 4];
B = [5 6; 7 8];

% element-wise (use .)
A .* B                           % [5 12; 21 32]
A ./ B                           % element-wise divide
A .^ 2                           % [1 4; 9 16]
A .^ B                           % element-wise power

% matrix ops (no .)
A * B                            % matrix product
A / B                            % A * inv(B)
A \ B                            % inv(A) * B
A^2                              % A * A (matrix power)
A'                               % conjugate transpose
A.'                              % non-conjugate transpose

% common gotcha
x = [1 2 3];
x * x                            % ERROR: inner dims mismatch
x * x'                           % 14 (dot product)
x .* x                           % [1 4 9] (element-wise)

Reshape e indexação

O MATLAB armazena matrizes em ordem coluna-major, então A(5) em uma 4x4 é A(1, 2). A indexação lógica (A(mask)) é poderosa e rápida — extraia ou modifique elementos que correspondem a uma condição sem loops. reshape requer que a contagem total de elementos corresponda. permute generaliza a transposição para arrays N-D.

matlab
A = magic(4);                  % 4x4 matrix

% linear indexing (column-major)
A(5)                             % A(1, 2)
A(:)                             % column vector of all elements
A(2:5)                           % elements 2-5

% submatrix
A(1:2, 2:4)                      % rows 1-2, cols 2-4
A(:, 3)                          % all rows, col 3
A(end, :)                        % last row
A(1:2:end, :)                    % odd rows (stride)

% logical indexing
mask = A > 10;
A(mask)                          % flat list of values > 10
A(A > 10) = 0;                   % threshold in-place

% reshape, permute, flip
B = reshape(A, 2, 8);
C = permute(A, [2 1]);           % transpose N-D
flip(A); flipud(A); fliplr(A);
repmat(A, 2, 3);                 % tile 2x3

Matrizes esparsas

Matrizes esparsas armazenam apenas elementos não nulos — essencial para matrizes grandes que são em sua maioria zero (por exemplo, de discretizações de EDPs). As operações preservam a esparsidade quando possível. A barra invertida S\b usa um solver direto esparso (UMFPACK) — muito mais rápido e eficiente em memória que full()\b para sistemas esparsos grandes. spy visualiza o padrão de esparsidade.

matlab
% create sparse
S = sparse(1000, 1000);
S(1, 1) = 5;
S(500, 500) = 10;

% from triplets
i = [1 2 3 4];
j = [1 2 3 4];
v = [10 20 30 40];
S = sparse(i, j, v, 4, 4);

% sparse identity and diagonal
S = speye(1000);
S = spdiags(ones(1000, 1), 0, 1000, 1000);

% operations stay sparse
S = S + S';
S = S * S;
x = S \ b;                       % uses sparse solver

% convert
F = full(S);                     % sparse -> full
S = sparse(F);                   % full -> sparse
nnz(S)                           % count non-zeros
spy(S)                           % visualize sparsity

Broadcasting (expansão implícita)

Desde R2016b, o MATLAB faz broadcasting automaticamente (como NumPy) — dimensões de tamanho 1 expandem para corresponder. Antes disso, você precisava de bsxfun. O broadcasting torna o código mais limpo: M - mean(M, 2) centraliza cada linha sem repmat. As dimensões devem ser compatíveis (iguais ou uma delas é 1).

matlab
% R2016b+ — automatic broadcasting
A = magic(3);                    % 3x3
b = [1 2 3];                     % 1x3

% older MATLAB: error (dims mismatch)
% modern MATLAB: b is broadcast across rows
C = A + b;                       % 3x3 result
C = A - b';
C = A .* b;

% common uses
x = (1:5)';                      % column
y = (1:5);                       % row
outer = x * y;                   % 5x5 outer product
grid = x + y;                    % 5x5 addition grid

% mean across rows
M = magic(5);
row_means = mean(M, 2);          % 5x1
centered = M - row_means;        % broadcast subtraction

% bsxfun (legacy, pre-R2016b)
C = bsxfun(@plus, A, b);         % same as A + b
20

Cell Arrays e Structs

Cell arrays

Cell arrays contêm tipos mistos. Use {} para acessar conteúdos (remove o invólucro de célula) e () para obter uma subcélula. cellfun aplica uma função a cada célula — passe 'UniformOutput', false se os resultados forem heterogêneos. Cell arrays são a maneira padrão de manter strings de comprimentos diferentes (pré-string array).

matlab
% heterogeneous container
C = {'hello', 42, [1 2 3], magic(3)};

% access
C{1}                             % 'hello' (contents)
C(1)                             % {1x1 cell} (cell)
C{4}(2, 2)                       % access inside

% build dynamically
C = {};
for k = 1:5
  C{k} = rand(k);
end

% multi-element
[a, b, c] = C{1:3};              % unpack
C{1:3}                           % comma-separated list

% cellfun
nums = {1, 2, 3, 4};
squared = cellfun(@(x) x^2, nums);
lengths = cellfun(@length, C);

% convert
cell([1 2 3])                    % {1, 2, 3}
cell2mat({1 2; 3 4})             % [1 2; 3 4]
mat2cell(magic(4), [2 2], [2 2]) % 2x2 cell of blocks

Struct arrays

Structs agrupam campos nomeados de qualquer tipo. Struct arrays contêm múltiplos registros — {arr.field} reúne um campo em todos os elementos em uma célula, [arr.field] em um array regular (se compatível). Campos aninhados usam encadeamento de ponto. fieldnames lista campos; rmfield retorna uma cópia sem o campo.

matlab
% scalar struct
s.name = 'Alice';
s.age = 30;
s.scores = [90 85 92];

% struct constructor
s = struct('name', 'Bob', 'age', 25, 'scores', {[80 70]});

% struct array
students(1).name = 'Alice';
students(1).age = 30;
students(2).name = 'Bob';
students(2).age = 25;

% access across array
names = {students.name};         % all names (cell)
ages = [students.age];           % all ages (vector)

% nested
s.course.code = 'CS101';
s.course.credits = 3;
s.course.instructor.name = 'Dr. Smith';

% field operations
fieldnames(s)                    % list fields
isfield(s, 'age')                % check field
rmfield(s, 'age')                % remove field
orderfields(s)                   % sort fields

Tables (dados tabulares)

Tables (R2013b+) são a maneira moderna de manter dados tabulares — como um DataFrame em pandas. Acesse colunas por nome (T.Age) ou índice (T.(2)). sortrows ordena por uma ou mais colunas. readtable/writetable lidam com CSV, Excel, etc. summary fornece estatísticas por coluna. Prefira tables a matrizes brutas para dados heterogêneos.

matlab
% create table
Names = {'Alice'; 'Bob'; 'Carol'};
Age = [30; 25; 42];
Score = [90; 80; 95];
T = table(Names, Age, Score);

% access
T.Age                            % column as vector
T.(2)                            % column by index
T{1, 2}                          % row 1, col 2 (cell-style)
T(1:2, :)                        % first 2 rows

% add/remove columns
T.Grade = {'A'; 'B'; 'A'};
T.Grade = [];                    % remove column

% filtering
T(T.Age > 26, :)                 % rows where Age > 26
find(T.Age > 26);

% sorting
T = sortrows(T, 'Age');
T = sortrows(T, {'Age', 'Score'}, 'descend');

% summary
summary(T)
T.Properties.VariableNames

% read/write
T = readtable('data.csv');
writetable(T, 'out.csv')

Timetables

Timetables (R2016b+) são tables com carimbos de data/hora nas linhas. retime reamostra/agrega (por exemplo, 'hourly', 'daily', ou TimeStep personalizado). synchronize alinha múltiplas timetables a um vetor de tempo comum. lag/lead deslocam colunas. Muito mais limpo que gerenciar índices de tempo manualmente em matrizes.

matlab
% create timetable with timestamps
Time = datetime(2024, 1, 1) + hours(0:23)';
Temp = 20 + 5 * randn(24, 1);
TT = timetable(Time, Temp);

% indexing by time
TT.timerange(datetime(2024,1,1,6,0,0), datetime(2024,1,1,12,0,0))
TT(datetime(2024,1,1,10,0,0), :) % row at specific time
TT('2024-01-01 10:00:00', :)

% resample / synchronize
TT_30min = retime(TT, 'regular', 'mean', 'TimeStep', minutes(30));
TT_hourly = retime(TT, 'hourly', 'mean');

% aggregate
TT_daily = retime(TT, 'daily', @mean);
TT_daily_max = retime(TT, 'daily', 'max');

% combine timetables
TT2 = synchronize(TT1, TT2, 'union');

% lagging
TT.PrevTemp = lag(TT.Temp, 1);

Maps (dicionários)

containers.Map é o hash map legado — funciona em todas as versões do MATLAB, mas é mais lento e sem tipagem. dictionary (R2022b+) é a substituição moderna: tipada, mais rápida e suporta consulta vetorizada. Use maps quando você precisa de consulta O(1) por chave em vez de pesquisar um array de struct ou célula.

matlab
% containers.Map (pre-R2022b)
m = containers.Map;
m('apple') = 1;
m('banana') = 2;
m('cherry') = 3;

% access
m('apple')                       % 1
m.Keys                           % {'apple', 'banana', 'cherry'}
m.Values                         % [1, 2, 3]
isKey(m, 'apple')                % true
remove(m, 'banana');

% iterate
keys = m.keys;
for k = 1:length(keys)
  fprintf('%s -> %d\n', keys{k}, m(keys{k}));
end

% R2022b+ dictionary (faster, typed)
d = dictionary({'apple', 'banana'}, [1, 2]);
d('cherry') = 3;
d('apple')                        % 1
keys(d); values(d)
21

Otimização

Otimização restrita fmincon

fmincon é o padrão para minimização não linear restrita. A função nonlcon deve retornar [c, ceq] onde c <= 0 (desigualdade) e ceq = 0 (igualdade). deal é uma maneira limpa de retornar múltiplas saídas de uma função anônima. Defina Algorithm com base no tipo de problema: 'interior-point' (geral), 'sqp' (pequeno/médio, costuma ser mais rápido).

matlab
% minimize objective with constraints
% min f(x) s.t. A*x <= b, Aeq*x = beq, lb <= x <= ub, c(x) <= 0, ceq(x) = 0

fun = @(x) (x(1) - 2)^2 + (x(2) - 3)^2;

% linear inequality: x1 + x2 <= 4
A = [1 1]; b = 4;
% linear equality: x1 - x2 = 0
Aeq = [1 -1]; beq = 0;
% bounds
lb = [0 0]; ub = [5 5];
% nonlinear: x1^2 + x2^2 >= 1 (so -(x1^2 + x2^2 - 1) <= 0)
nonlcon = @(x) deal(-(x(1)^2 + x(2)^2 - 1), []);

x0 = [1 1];
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon);

% options
opts = optimoptions('fmincon', 'Display', 'iter', ...
                    'Algorithm', 'interior-point');
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, opts);

fminunc sem restrições

fminunc minimiza funções não lineares sem restrições. Fornecer o gradiente (via SpecifyObjectiveGradient) melhora drasticamente a velocidade e a precisão. A aproximação de Hessiana BFGS padrão funciona bem para problemas suaves; para grandes, 'lbfgs' limita a memória. Verifique exitflag (>0 = convergiu) e firstorderopt (deve ser minúsculo).

matlab
% unconstrained minimization
fun = @(x) 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;  % Rosenbrock

x0 = [-1.2 1];
[x, fval, flag, out] = fminunc(fun, x0);

% with gradient (faster, more accurate)
syms x1 x2
f = 100*(x2 - x1^2)^2 + (1 - x1)^2;
grad = gradient(f, [x1, x2]);
fun_grad = matlabFunction(f, grad, 'Vars', {x1, x2});

opts = optimoptions('fminunc', 'SpecifyObjectiveGradient', true, ...
                    'Display', 'iter');
[x, fval] = fminunc(@(x) fun_grad(x(1), x(2)), x0, opts);

% check optimality
disp(out.firstorderopt)           % should be near 0

% Hessian option
opts.Hessian = 'bfgs';            % quasi-Newton (default)
opts.Hessian = 'lbfgs';           % for large sparse problems

Programação linear linprog

linprog resolve programas lineares. Para variáveis inteiras/binárias, use intlinprog (substitui o bintprog obsoleto). intcon lista quais variáveis são restritas a inteiros. Defina lb=0, ub=1 para binário. O algoritmo dual-simplex é o padrão e mais rápido para a maioria dos problemas.

matlab
% min f'*x s.t. A*x <= b, Aeq*x = beq, lb <= x <= ub

% example: min -x1 - 2*x2
%   s.t.  x1 + x2 <= 4
%          x1 + 3*x2 <= 6
%          x1, x2 >= 0
f = [-1; -2];
A = [1 1; 1 3];
b = [4; 6];
lb = [0; 0];

opts = optimoptions('linprog', 'Display', 'iter');
[x, fval, exitflag, output] = linprog(f, A, b, [], [], lb, [], opts);

% integer programming (intlinprog)
intcon = 1:2;                     % variables 1 and 2 are integers
[x, fval] = intlinprog(f, intcon, A, b, [], [], lb, []);

% binary variables: set lb=0, ub=1, and add to intcon
lb = [0; 0]; ub = [1; 1];
[x, fval] = intlinprog(f, intcon, A, b, [], [], lb, ub);

lsqcurvefit e ajuste de curvas

lsqcurvefit ajusta modelos paramétricos a dados via mínimos quadrados. polyfit é a escolha fácil para polinômios. Para R² (coeficiente de determinação), calcule manualmente: 1 - SSE/SST. O algoritmo Levenberg-Marquardt é bom para problemas sem restrições; trust-region-reflective lida com limites.

matlab
% fit y = a*exp(b*x) to data
xdata = linspace(0, 5, 50)';
ydata = 2.5 * exp(-0.7 * xdata) + 0.05 * randn(50, 1);

model = @(p, x) p(1) * exp(p(2) * x);

x0 = [1, -1];
[params, resnorm, residual, exitflag] = lsqcurvefit(model, x0, xdata, ydata);

% with bounds
lb = [0, -5]; ub = [10, 0];
[params, resnorm] = lsqcurvefit(model, x0, xdata, ydata, lb, ub);

% polyfit for polynomials
p = polyfit(xdata, ydata, 3);     % cubic
yfit = polyval(p, xdata);

% fit with custom output
opts = optimoptions('lsqcurvefit', 'Display', 'off', ...
                    'Algorithm', 'levenberg-marquardt');
[params, resnorm] = lsqcurvefit(model, x0, xdata, ydata, [], [], opts);

% goodness of fit
sse = sum((ydata - model(params, xdata)).^2);
sst = sum((ydata - mean(ydata)).^2);
r2 = 1 - sse / sst;

Otimização global

Ferramentas de otimização global (no Global Optimization Toolbox) ajudam com problemas não convexos onde solvers locais ficam presos. MultiStart executa um solver local a partir de muitos pontos iniciais aleatórios. GlobalSearch é mais inteligente — ele filtra pontos iniciais promissores. ga (algoritmo genético) e simulannealbnd são sem derivadas. patternsearch é bom para problemas não suaves.

matlab
% MultiStart: run local solver from many points
fun = @(x) x(1)^2 + x(2)^2 + 10*sin(x(1)) + 10*sin(x(2));
ms = MultiStart('Display', 'iter');
opts = optimoptions('fmincon', 'Algorithm', 'interior-point');
problem = createOptimProblem('fmincon', 'objective', fun, ...
                            'x0', [0 0], 'lb', [-5 -5], 'ub', [5 5]);
[x, fval] = run(ms, problem, 50);  % 50 starting points

% GlobalSearch: smarter, fewer starts
gs = GlobalSearch;
[x, fval] = run(gs, problem);

% ga (genetic algorithm)
[x, fval] = ga(fun, 2, [], [], [], [], [-5 -5], [5 5]);

% simulannealbnd (simulated annealing)
[x, fval] = simulannealbnd(fun, [0 0], [-5 -5], [5 5]);

% patternsearch
[x, fval] = patternsearch(fun, [0 0]);
22

Processamento de Imagens

Lendo e exibindo imagens

imread retorna arrays uint8 para a maioria dos formatos de imagem. rgb2gray converte RGB para tons de cinza. im2double redimensiona para [0, 1] — use isto (não double()) antes do processamento de float. imshow auto-redimensiona imagens double: [0, 1] é o intervalo esperado. imwrite suporta opções de qualidade/compressão.

matlab
% read and display
img = imread('photo.jpg');
imshow(img);

% info
size(img)                         % rows x cols x channels
class(img)                        % usually uint8
imfinfo('photo.jpg')              % metadata

% convert types
gray = rgb2gray(img);             % RGB -> gray
img_double = im2double(img);      % uint8 [0,255] -> double [0,1]
img_uint8 = im2uint8(img_double);

% write
imwrite(gray, 'gray.png');
imwrite(img, 'compressed.jpg', 'Quality', 80);

% display multiple
figure;
subplot(1, 2, 1); imshow(img); title('Original');
subplot(1, 2, 2); imshow(gray); title('Grayscale');

% pixel info
impixelinfo;                      % interactive pixel values
img(100, 200, :)                  % pixel at (row, col)

Filtragem e convolução

imgaussfilt é o desfoque Gaussiano moderno (substitui fspecial('gaussian') + imfilter). medfilt2 é a escolha certa para ruído sal-e-pimenta (filtro de média apenas espalha). fspecial cria kernels comuns (sobel, prewitt, laplacian, gaussian, disk, motion). imfilter faz correlação por padrão — passe 'conv' para convolução verdadeira.

matlab
img = imread('cameraman.tif');
img = im2double(img);

% Gaussian blur
blurred = imgaussfilt(img, 2);    % sigma = 2
blurred = imgaussfilt(img, 2, 'FilterSize', 7);

% median filter (great for salt-and-pepper noise)
noisy = imnoise(img, 'salt & pepper', 0.05);
denoised = medfilt2(noisy, [3 3]);

% custom kernel
h = fspecial('sobel');            % edge detection
edges = imfilter(img, h);
h = fspecial('laplacian', 0);
sharpened = img - imfilter(img, h);

% 2D convolution vs correlation
out_conv = imfilter(img, h, 'conv');
out_corr = imfilter(img, h, 'corr');  % default

% unsharp masking
sharp = imsharpen(img, 'Amount', 1.5, 'Radius', 2);

Operações morfológicas

Operações morfológicas funcionam em imagens binárias. Erode encolhe objetos; dilate os cresce. Open (erode depois dilate) remove pequeno ruído; close (dilate depois erode) preenche pequenas lacunas. strel cria elementos estruturantes — disk/square/line/octagon. bwareaopen remove pequenos objetos; imfill preenche buracos; bwperim extrai bordas.

matlab
bw = imread('text.png');
bw = imbinarize(bw);              % grayscale -> binary

% basic ops
eroded = imerode(bw, strel('square', 3));
dilated = imdilate(bw, strel('disk', 2));
opened = imopen(bw, strel('square', 5));
closed = imclose(bw, strel('square', 5));

% structuring elements
se = strel('square', 3);
se = strel('disk', 5);
se = strel('line', 10, 45);       % length 10, angle 45 deg
se = strel('octagon', 3);

% remove small objects
clean = bwareaopen(bw, 50);       % remove <50 pixels

% skeleton
skel = bwmorph(bw, 'skel', Inf);

% fill holes
filled = imfill(bw, 'holes');

% boundary
boundary = bwperim(bw);

Detecção de bordas e segmentação

edge com 'canny' é o detector de bordas mais robusto (especifique limites [low high] e sigma). imbinarize com 'adaptive' lida com iluminação desigual. bwconncomp encontra componentes conectados; regionprops extrai medidas (Area, Centroid, BoundingBox, etc.). watershed separa objetos em toque — compute no gradiente para encontrar bordas.

matlab
img = imread('coins.png');
img = im2double(img);

% edges
edges_sobel = edge(img, 'sobel');
edges_canny = edge(img, 'canny', [0.1 0.2], 1.5);
edges_prewitt = edge(img, 'prewitt');

% thresholding
bw = imbinarize(img);
bw_otsu = imbinarize(img, 'adaptive');  % local threshold

% connected components
cc = bwconncomp(bw);
stats = regionprops(cc, 'Area', 'Centroid', 'BoundingBox');
areas = [stats.Area];
[~, idx] = sort(areas, 'descend');
biggest = stats(idx(1));

% watershed segmentation
grad = imgradient(img);
L = watershed(grad);
L(L == 0) = NaN;
imshow(img); hold on; imshow(L, []);

Cor e transformadas

rgb2hsv, rgb2lab convertem espaços de cor — HSV é intuitivo para seleção de cores; L*a*b* separa luminância de cor (bom para diferença de cor). fft2 + fftshift centralizam o espectro para filtragem. imresize/imrotate/imcrop são operações geométricas — 'bilinear' (padrão) costuma ser o melhor; 'nearest' é o mais rápido, mas blocado.

matlab
img = imread('peppers.png');

% color space conversion
hsv = rgb2hsv(img);
lab = rgb2lab(img);
gray = rgb2gray(img);
rgb = hsv2rgb(hsv);

% extract channels
R = img(:, :, 1);
G = img(:, :, 2);
B = img(:, :, 3);

% Fourier transform
f = fft2(double(gray));
f = fftshift(f);                  % center zero freq
mag = log(1 + abs(f));
imshow(mag, []);

% inverse
f_filtered = f;
f_filtered(abs(f) < 100) = 0;    % low-pass filter
filtered = real(ifft2(ifftshift(f_filtered)));
imshow(filtered, []);

% resize, rotate
small = imresize(img, 0.5);
rotated = imrotate(img, 45, 'bilinear', 'crop');
cropped = imcrop(img, [50 50 200 150]);  % [x y w h]
23

GUI/App Designer

Básico do App Designer

App Designer (R2016a+) é a ferramenta GUI moderna, substituindo o GUIDE. Os componentes são acessados via app.<Name>. Callbacks recebem (app, event). Propriedades personalizadas (na Code View) compartilham estado entre callbacks. Salve como .mlapp (binário) ou exporte para .m. Execute digitando o nome do app na janela de comando.

matlab
% Open App Designer:
%   >> appdesigner
% Drag components from the left, set properties on the right.

% Callback structure (auto-generated):
function ButtonPushed(app, event)
    x = linspace(0, 2*pi, 100);
    plot(app.UIAxes, x, sin(x));
    app.ResultEditField.Value = 'Plot done';
end

% Access components via app.<ComponentName>
%   app.UIAxes, app.Button, app.EditField, app.Slider, ...

% Property panel: add custom properties
properties (Access = private)
    data;                          % shared between callbacks
end

% Startup callback:
function startupFcn(app)
    app.data = rand(10);
    app.Slider.Value = 50;
end

% Save as .mlapp, run with:
%   >> myApp  (if named myApp.mlapp)
% Or export to a standalone .m file.

UI programática com uifigure

uifigure (R2016b+) é o framework UI programático moderno — suporta widgets modernos (gauge, knob, switch, tree) que figure não suporta. Defina callbacks via propriedades *Fcn usando funções anônimas @(src, event) .... uiwait bloqueia até a figura fechar; uiresume a libera.

matlab
% modern uifigure (R2016b+) — preferred
fig = uifigure('Name', 'My App', 'Position', [100 100 600 400]);

ax = uiaxes(fig, 'Position', [200 100 350 250]);
plot(ax, 1:10);

btn = uibutton(fig, 'Text', 'Plot', 'Position', [50 100 100 30]);
btn.ButtonPushedFcn = @(~,~) plot(ax, rand(1, 10));

slider = uislider(fig, 'Position', [50 200 100 3]);
slider.ValueChangedFcn = @(s,~) disp(s.Value);

% dropdown
dd = uidropdown(fig, 'Items', {'a', 'b', 'c'}, 'Position', [50 250 100 30]);
dd.ValueChangedFcn = @(s,~) fprintf('Selected: %s\n', s.Value);

% list box
lb = uilistbox(fig, 'Items', {'one', 'two', 'three'}, ...
               'Multiselect', 'on', 'Position', [50 50 100 80]);

% wait for user to close
uiwait(fig);

Componentes comuns de UI

Componentes modernos de UI: uieditfield (texto ou numérico), uibuttongroup (gerencia radio buttons), uicheckbox, uitable (vincula a uma tabela), uitabgroup/uitab (abas). Todos aceitam um parent como primeiro argumento e usam Name-Value pairs para propriedades. Callbacks disparam na interação do usuário; acesse novos valores via argumento source.

matlab
fig = uifigure;

% label
lbl = uilabel(fig, 'Text', 'Enter value:', 'Position', [20 200 100 22]);

% edit field
ef = uieditfield(fig, 'numeric', 'Value', 42, 'Position', [130 200 100 22]);
ef.ValueChangedFcn = @(s,~) fprintf('New: %g\n', s.Value);

% button group with radio buttons
bg = uibuttongroup(fig, 'Title', 'Mode', 'Position', [20 100 200 80]);
r1 = uiradiobutton(bg, 'Text', 'A', 'Position', [10 40 100 22]);
r2 = uiradiobutton(bg, 'Text', 'B', 'Position', [10 10 100 22]);
r1.Value = true;

% check box
cb = uicheckbox(fig, 'Text', 'Enable', 'Position', [20 50 100 22]);

% table
tdata = table({'A'; 'B'}, [1; 2], 'VariableNames', {'Name', 'Value'});
uit = uitable(fig, 'Data', tdata, 'Position', [250 50 200 150]);

% tab group
tg = uitabgroup(fig);
t1 = uitab(tg, 'Title', 'Tab 1');
t2 = uitab(tg, 'Title', 'Tab 2');
plot(uiaxes(t1), 1:10);

Diálogos e prompts

inputdlg coleta entrada de texto; questdlg para sim/não/cancelar; listdlg para seleção; uigetfile/uiputfile para seletores de arquivos; msgbox/errordlg/warndlg para notificações. fullfile junta caminhos de forma portátil (melhor que concatenação de strings). Sempre verifique se o usuário não cancelou (retorno vazio ou ok == false).

matlab
% input dialog
answer = inputdlg({'Name:', 'Age:'}, 'User Info', [1 50; 1 10]);
if ~isempty(answer)
    name = answer{1};
    age = str2double(answer{2});
end

% question dialog
btn = questdlg('Save changes?', 'Confirm', 'Yes', 'No', 'Cancel', 'Yes');
switch btn
    case 'Yes', save_data();
    case 'No',  % discard
    case 'Cancel', return;
end

% list dialog
[sel, ok] = listdlg('PromptString', 'Select items:', ...
                    'ListString', {'Apple', 'Banana', 'Cherry'}, ...
                    'SelectionMode', 'multiple');

% file dialogs
[file, path] = uigetfile('*.csv', 'Select CSV');
[file, path] = uiputfile('*.mat', 'Save as');
fullpath = fullfile(path, file);

% message dialog
msgbox('Done!', 'Info', 'help');
errordlg('Something went wrong', 'Error');
warndlg('Check this', 'Warning');

Compartilhamento e implantação

Para compartilhamento: arquivos .mlapp exigem MATLAB; apps standalone (via MATLAB Compiler) rodam sem MATLAB, mas precisam do MATLAB Runtime gratuito; web apps rodam em um navegador via MATLAB Web App Server. Exportar para .m fornece código-fonte legível. Empacote como toolbox para distribuição via Add-Ons.

matlab
% Run as standalone app
%   1. In App Designer: Designer Tab > App Store Details > Save as .mlapp
%   2. Share the .mlapp file — others open it in MATLAB

% Create standalone app (requires MATLAB Compiler)
%   >> mcr.build('myApp.mlapp')        % R2024a+
%   or
%   >> deploytool                       % legacy

% Web App (requires MATLAB Web App Server)
%   >> compiler.build.webApp('myApp.mlapp')

% Export to code (readable .m)
%   In App Designer: Designer Tab > Export > Export to .m file

% Pack as toolbox (for sharing with colleagues)
%   >> matlab.addons.toolbox.packageToolbox('myApp.prj)

% Tips:
%   - Use try/catch in callbacks to avoid silent failures
%   - Set app.UIFigure.Name to identify your app
%   - Test on a clean MATLAB session before deploying
24

E/S de Arquivos Avançada

E/S de arquivo de baixo nível

fopen retorna -1 em caso de falha — sempre verifique. fgetl lê uma linha sem a nova linha; fgets a mantém. fscanf lê dados formatados; fread lê binário. fseek/ftell navegam. Sempre fclose ao terminar (use onCleanup por segurança: c = onCleanup(@() fclose(fid));).

matlab
fid = fopen('data.txt', 'r');   % r, w, a, r+, w+
if fid == -1; error('Cannot open file'); end

% read line by line
while ~feof(fid)
  line = fgetl(fid);              % without newline
  fprintf('%s\n', line);
end

% formatted read
% data.txt: "Alice 30 90.5"
A = fscanf(fid, '%s %d %f', [3 1]);

% formatted write
fprintf(fid, '%s, %d, %.2f\n', 'Bob', 25, 85.3);

% binary I/O
data = fread(fid, [10 5], 'double');  % 10x5 doubles
fwrite(fid, data, 'double');

% position
fseek(fid, 0, 'bof');             % beginning
fseek(fid, 0, 'eof');             % end
pos = ftell(fid);

fclose(fid);                      % ALWAYS close

textscan para dados mistos

textscan é mais flexível que fscanf — lida com tipos mistos, delimitadores personalizados e retorna um cell array de colunas. 'TreatAsEmpty' converte marcadores em NaN. 'CollectOutput' agrupa colunas do mesmo tipo em um array. fileread lê o arquivo inteiro como string — conveniente para arquivos pequenos ou processamento com regex.

matlab
fid = fopen('data.csv', 'r');

% skip header line
header = fgetl(fid);

% parse remaining
% Format: Alice,30,90.5,B+
C = textscan(fid, '%s %d %f %s', ...
             'Delimiter', ',', ...
             'MultipleDelimsAsOne', true, ...
             'TreatAsEmpty', {'NA', 'N/A'}, ...
             'HeaderLines', 0);
fclose(fid);

names = C{1}; ages = C{2}; scores = C{3}; grades = C{4};

% alternative: read whole file at once
str = fileread('data.txt');

% from string
C = textscan('1 2 3\n4 5 6', '%d %d %d');
% C{1} = [1; 4], C{2} = [2; 5], C{3} = [3; 6]

% collectoutput (group columns of same type)
C = textscan(fid, '%s %d %d %f', 'CollectOutput', true);
% C{2} = [ages, more_ints] as one matrix

Arquivos MAT e save/load

save/load com arquivos .mat preservam tipos e estrutura de variáveis. -v7.3 suporta arquivos > 2GB (e é o padrão no MATLAB moderno). -append adiciona variáveis sem reescrever. Para arquivos enormes, carregue apenas o necessário por nome. Para exportação em texto, use -ascii (limitado) ou writematrix/writetable para mais controle.

matlab
A = magic(5);
B = struct('name', 'Alice', 'age', 30);
C = rand(100);

% save variables
save('data.mat', 'A', 'B', 'C');
save('data.mat', 'A', 'B', '-v7.3');  % large files > 2GB
save('data.mat', '-append', 'C');     % add to existing

% load
loaded = load('data.mat');       % struct with variables
loaded.A
loaded.B.age

% or load into workspace
load('data.mat');                % A, B, C now in workspace

% partial load (huge files)
info = whos('-file', 'bigdata.mat');
loaded = load('bigdata.mat', 'A');  % only A

% save specific format
save('data.txt', 'A', '-ascii', '-double');
save('data.csv', 'A', '-ascii', '-delimiter', ',');

% compressed
save('data.mat', 'A', '-v7.3', '-nocompression');

HDF5 e formatos científicos

HDF5 é o padrão para grandes conjuntos de dados numéricos — suporta chunking, compressão e dimensões extensíveis. h5read com start/count permite ler fatias sem carregar o arquivo inteiro. NetCDF é comum em ciências climáticas/oceanográficas; FITS em astronomia. MATLAB também suporta nativamente formatos TIFF, DICOM, áudio e vídeo.

matlab
% HDF5 (great for large scientific datasets)
% write
h5create('data.h5', '/dataset1', [100 50 20]);
data = rand(100, 50, 20);
h5write('data.h5', '/dataset1', data);

% read
info = h5info('data.h5');
data = h5read('data.h5', '/dataset1');
partial = h5read('data.h5', '/dataset1', [1 1 1], [10 10 5]);

% append (extendable datasets)
h5create('data.h5', '/growable', [100 Inf], 'ChunkSize', [100 100]);
for k = 1:5
  h5write('data.h5', '/growable', rand(100, 100), [1 (k-1)*100+1]);
end

% NetCDF (climate/ocean data)
ncid = netcdf.open('data.nc', 'NC_NOWRITE');
varid = netcdf.inqVarID(ncid, 'temperature');
data = netcdf.getVar(ncid, varid);
netcdf.close(ncid);

% FITS (astronomy)
fitsdisp('image.fits');
data = fitsread('image.fits');

JSON e XML

jsonencode/jsondecode (R2016b+) lidam com JSON nativamente. Structs viram objetos JSON; cell arrays viram arrays. Para XML, xmlread retorna um objeto Java DOM — use métodos Java para percorrer. xmlwrite serializa um DOM de volta para arquivo. Para XML complexo, considere o xml2struct de terceiros ou a API DOM diretamente.

matlab
% JSON (R2016b+)
data = struct('name', 'Alice', 'age', 30, 'scores', [90 80 85]);
txt = jsonencode(data, 'PrettyPrint', true);
disp(txt);

decoded = jsondecode(txt);
decoded.name                     % 'Alice'

% JSON with cell arrays for mixed types
data = struct('items', {{'apple', 42, [1 2 3]}});
txt = jsonencode(data);

% read JSON file
txt = fileread('config.json');
config = jsondecode(txt);

% XML
doc = xmlread('data.xml');
root = doc.getDocumentElement;
children = root.getChildNodes;
for k = 0:children.getLength - 1
  node = children.item(k);
  if node.getNodeType == doc.ELEMENT_NODE
    fprintf('%s: %s\n', node.getNodeName, char(node.getTextContent));
  end
end

% write XML
doc = com.mathworks.xml.XMLUtils.createDocument('root');
root = doc.getDocumentElement;
child = doc.createElement('item');
child.appendChild(doc.createTextNode('hello'));
root.appendChild(child);
xmlwrite('out.xml', doc);
25

Computação Paralela

loops parfor

parfor executa iterações do loop em paralelo entre workers. As iterações devem ser independentes. Variáveis são classificadas: sliced (cada iteração toca um índice único), broadcast (somente leitura), reduction (combinadas com uma operação associativa como + ou *) e temp (criadas dentro). A classificação determina o que é permitido.

matlab
% requires Parallel Computing Toolbox
% start pool
pool = gcp('nocreate');
if isempty(pool), parpool; end

% parfor: parallel for loop
N = 1000;
results = zeros(1, N);
parfor k = 1:N
  results(k) = some_expensive_function(k);
end

% constraints:
%   - iterations must be independent (no order dependency)
%   - body cannot contain break/return
%   - variables classified as sliced, broadcast, reduction, temp

% reduction variables
total = 0;
parfor k = 1:N
  total = total + compute(k);
end

% sliced variables (independent indexing)
data = rand(N, 100);
out = zeros(N, 1);
parfor k = 1:N
  out(k) = mean(data(k, :));
end

spmd e arrays distribuídos

spmd executa o mesmo código em todos os workers, com labindex identificando cada um. Use para algoritmos data-parallel onde workers se comunicam (ex.: estilo MPI). Arrays distribuídos espalham uma matriz grande entre workers — operações neles permanecem distribuídas; gather() traz o resultado de volta ao cliente. Composite armazena valores por worker.

matlab
% spmd: single program, multiple data
spmd
  % code runs on every worker
  % labindex: this worker's ID (1 to numlabs)
  % numlabs: total workers
  fprintf('Worker %d of %d\n', labindex, numlabs);

  % each worker computes a chunk
  local_data = rand(100, 1);
  local_sum = sum(local_data);
end

% combine results
total = sum([local_sum{:}]);

% distributed arrays (split across workers)
D = distributed.rand(10000, 10000);  % huge matrix
local_size = size(D, 'local')        % each worker's chunk
total_size = size(D)                  % logical total

% operations auto-distribute
S = D * D';
S_local = gather(S);                  % pull to client (if fits)

% Composite (cell-like, one per worker)
C = Composite();
spmd
  C{labindex} = magic(labindex + 1);
end
C{1}                              % access worker 1's value

gpuArray

gpuArray move dados para a GPU; operações em gpuArrays rodam na GPU automaticamente. gather() traz os dados de volta. Operações element-wise e de multiplicação de matriz veem o maior ganho de velocidade; código escalar ou com branching não vê. arrayfun em gpuArrays permite rodar funções element-wise personalizadas na GPU sem escrever CUDA.

matlab
% requires GPU support (most NVIDIA GPUs)
% move data to GPU
A = gpuArray(rand(10000));
B = gpuArray(rand(10000));

% operations run on GPU
C = A * B;                        % still on GPU
D = sin(A) + cos(B);
E = sum(A, 1);

% bring back to CPU
C_cpu = gather(C);

% check GPU
gpuDevice                        % info about current GPU
gpuDeviceCount                   % number of available GPUs
gpuDevice(1)                     % select device 1

% element-wise ops are typically fastest on GPU
% matrix multiply also very fast (cuBLAS)

% custom kernels (PTX)
k = parallel.gpu.CUDAKernel('my_kernel.ptx', 'my_kernel.cu');
result = feval(k, A, B);

% arrayfun on GPU (element-wise custom functions)
f = @(x) x^2 + sin(x);
result = arrayfun(f, A);

batch e job

batch executa uma função ou script em segundo plano — útil para jobs longos que você não quer bloquear a sessão MATLAB. wait(job) bloqueia até terminar; fetchOutputs recupera resultados. Sempre delete(job) para liberar recursos. 'Pool', N usa N workers adicionais para parfor dentro da função batch.

matlab
% run a function in background
job = batch(@my_function, 0, {arg1, arg2});

% check status
job.State                        % 'queued', 'running', 'finished'
wait(job);                       % block until done

% get results
results = fetchOutputs(job);
delete(job);                     % clean up

% batch script
job = batch('my_script.m');

% with pool
job = batch(@my_func, 1, {x}, 'Pool', 4);  % 4 extra workers

% batch with attached files
job = batch(@my_func, 1, {x}, ...
            'AttachedFiles', {'data.mat', 'helper.m'}, ...
            'CurrentFolder', '/path/to/work');

% list jobs
jobs = findJob(pool);
for j = jobs
  fprintf('Job %d: %s\n', j.ID, j.State);
end

% parallel pool settings
parpool('local', 4);              % 4 workers
delete(gcp('nocreate'));          % shut down pool

Dicas de desempenho

Pré-aloque arrays (zeros/ones) — crescer arrays em loops é o principal assassino de desempenho no MATLAB. Vetorize (sin(x) em vez de loop) — mais claro e frequentemente mais rápido. O JIT torna loops simples rápidos, mas a vetorização ainda vence em matemática. profile viewer encontra gargalos. Use precisão simples para dados enormes; escreva MEX files para verdadeiros pontos críticos.

matlab
% 1. Preallocate arrays
% BAD
for k = 1:1000
  x(k) = k^2;                    % grows array each iteration
end

% GOOD
x = zeros(1, 1000);
for k = 1:1000
  x(k) = k^2;
end

% 2. Vectorize instead of looping
% BAD
for k = 1:length(x)
  y(k) = sin(x(k));
end

% GOOD
y = sin(x);                      % one vectorized call

% 3. Use JIT-friendly patterns
% simple loops are now fast (JIT), but vectorize for clarity

% 4. Profile to find bottlenecks
profile on;
my_function();
profile viewer;

% 5. Prefer single precision for huge data
A = rand(10000, 'single');       % half the memory

% 6. MEX for critical sections
% compile C code: mex my_func.c
26

Orientação a Objetos

Definição de classe

Salve classdef em um arquivo chamado <ClassName>.m. Properties armazenam dados; methods definem comportamento. O construtor deve ter o nome da classe e tratar nargin==0 (chamado sem args). Dependent properties são computadas no acesso via métodos get.X. disp sobrescreve a exibição. Static methods não recebem obj.

matlab
% file: Point.m
classdef Point
  properties
    x = 0
    y = 0
  end

  properties (Dependent)
    r                              % computed on access
  end

  methods
    function obj = Point(x, y)
      if nargin > 0
        obj.x = x;
        obj.y = y;
      end
    end

    function r = get.r(obj)
      r = sqrt(obj.x^2 + obj.y^2);
    end

    function obj = move(obj, dx, dy)
      obj.x = obj.x + dx;
      obj.y = obj.y + dy;
    end

    function disp(obj)
      fprintf('Point(%.2f, %.2f), r=%.2f\n', obj.x, obj.y, obj.r);
    end
  end

  methods (Static)
    function p = origin()
      p = Point(0, 0);
    end
  end
end

Classes de valor vs handle

Classes de valor copiam na atribuição (como int ou struct); classes de handle passam por referência (como objetos Java). Para objetos mutáveis (uma conexão de banco de dados, um componente de UI), use handle. Classes de valor são mais simples e seguras para dados imutáveis. Classes de handle herdam de handle e suportam events/listeners e um destructor delete.

matlab
% Value class (default) — copied on assignment
classdef VPoint
  properties; x; end
  methods
    function obj = VPoint(x); obj.x = x; end
    function obj = setX(obj, x); obj.x = x; end
  end
end

p = VPoint(1);
p2 = p;                           % copy
p2 = setX(p2, 5);
disp(p.x)                         % still 1 (unchanged)

% Handle class — passed by reference
classdef HPoint < handle
  properties; x; end
  methods
    function obj = HPoint(x); obj.x = x; end
    function setX(obj, x); obj.x = x; end   % no return needed
  end
end

h = HPoint(1);
h2 = h;                           % same object
h2.setX(5);
disp(h.x)                         % 5 (shared)

% handle class features:
%   - events and listeners
%   - destructor (delete method)
%   - copy() method

Herança e polimorfismo

Subclasse com <. Chame o construtor da superclasse com obj@SuperClass(args). Polimorfismo funciona naturalmente — chame o método no tipo base e a sobrescrita correta é executada. MATLAB suporta herança múltipla (separe superclasses com &), mas apenas uma pode ser classe concreta; as demais devem ser interfaces.

matlab
% base class
classdef Animal
  properties; name; end
  methods
    function obj = Animal(name); obj.name = name; end
    function speak(obj)
      error('Abstract: subclass must override');
    end
    function describe(obj)
      fprintf('%s says: ', obj.name);
      obj.speak();
      fprintf('\n');
    end
  end
end

% subclass
classdef Dog < Animal
  methods
    function obj = Dog(name); obj = obj@Animal(name); end
    function speak(obj); fprintf('Woof'); end
  end
end

classdef Cat < Animal
  methods
    function obj = Cat(name); obj = obj@Animal(name); end
    function speak(obj); fprintf('Meow'); end
  end
end

% polymorphism
animals = {Dog('Rex'), Cat('Whiskers'), Dog('Buddy')};
for k = 1:length(animals)
  animals{k}.describe();
end

% multiple inheritance
classdef FlyingDog < Dog & IFlyable
  ...
end

Eventos e listeners

Eventos exigem uma classe handle. Declare events em um bloco events. notify dispara um evento; addlistener se inscreve. Listeners podem ser funções ou funções anônimas @(src, event). Dados de evento personalizados herdam de event.EventData. Listeners são excluídos quando o objeto de origem é excluído (ou você pode excluí-los explicitamente).

matlab
classdef Thermometer < handle
  properties
    temperature = 20
  end

  events
    temperatureChanged
    overheat
  end

  methods
    function set.temperature(obj, t)
      obj.temperature = t;
      notify(obj, 'temperatureChanged');
      if t > 100
        notify(obj, 'overheat');
      end
    end

    function obj = Thermometer()
      % add listener to own event
      addlistener(obj, 'overheat', @(s,e) disp('WARNING: too hot!'));
    end
  end
end

% usage
t = Thermometer();
lh = addlistener(t, 'temperatureChanged', @(s,e) ...
  fprintf('Now: %.1f\n', s.temperature));
lh2 = addlistener(t, 'overheat', @onOverheat);

t.temperature = 25;               % triggers temperatureChanged
t.temperature = 105;              % triggers both

% custom event data
classdef OverheatData < event.EventData
  properties; temp; end
end
% notify(obj, 'overheat', OverheatData(t));

Enumeração e propriedades

Classes de enumeração definem instâncias fixas — úteis para máquinas de estado, opções e tipos. Cada valor enum pode carregar dados via propriedades. Atributos de propriedade controlam o acesso: SetAccess=private torna somente leitura de fora; Constant para constantes de tempo de compilação; Hidden oculta da exibição; Access={?Class1, ?Class2} restringe a classes específicas.

matlab
% enumeration class
classdef Color
  enumeration
    Red [1 0 0]
    Green [0 1 0]
    Blue [0 0 1]
  end
  properties
    rgb
  end
  methods
    function obj = Color(rgb)
      obj.rgb = rgb;
    end
  end
end

c = Color.Red;
disp(c.rgb)                       % [1 0 0]

% switch on enum
switch c
  case Color.Red; disp('red');
  case Color.Green; disp('green');
end

% property attributes
classdef Account
  properties (SetAccess = private)
    balance = 0                   % readable outside, settable only inside
  end
  properties (Access = {?Account, ?Bank})
    internal_id                   % only Account and Bank classes
  end
  properties (Constant)
    PI = 3.14159                  % compile-time constant
  end
  properties (Hidden)
    cache                         % not shown by disp/struct
  end
end

Was this helpful?