Вы находитесь на странице: 1из 18

MATLAB

Tópicos Avançados

Sumário

1. Estruturas
2. Células

J. R. Caldas Pinto, J. M. da Costa Sousa 357

1
Tipos de dados avançados em Matlab

J. R. Caldas Pinto, J. M. da Costa Sousa 358

Estruturas

ƒ As estruturas (structures) são arrays em Matlab que


contêm vários campos (fields). Os campos de uma
estrutura pode conter qualquer tipo de dados.
ƒ Esta estrutura é semelhante às fichas em Fortran90.
‰Construção de estruturas
ƒ Utilizando atribuições:
paciente.nome = ’Carlos Soares’;
paciente.conta = 127.0;
paciente.teste = [79 75 73; 180 178 177.5;
220 210 205];

J. R. Caldas Pinto, J. M. da Costa Sousa 359

2
Construção de estruturas

ƒ As estruturas podem ser vectores ou matrizes:


paciente(2).nome = ’Ana Lourenço’;
paciente(2).conta = 28.5;
paciente(2).teste = [68 70 68; 118 118 119;
172 170 169];

ƒ Construção utilizando a função struct:


matriz_estrutura =
struct(’campo1’,valor1,’campo2’,valor2,...)

J. R. Caldas Pinto, J. M. da Costa Sousa 360

Construção de estruturas
‰Estruturas com repmat
tempo = repmat(struct(’temp’,72,’rainfall’,0.0),1,3);
ƒ Todas as estruturas na matriz tempo são inicializadas com
um campo de valores.
‰Estruturas com matrizes de células (cell array)
tempo = struct(’temp’,{68,80,72}, ’rainfall’,{0.2,0.4,0.0});
ƒ As estruturas na matriz tempo são inicializadas com valores
distintos, especificados pelas matrizes das células.

J. R. Caldas Pinto, J. M. da Costa Sousa 361

3
Exemplo

J. R. Caldas Pinto, J. M. da Costa Sousa 362

Acesso a dados em estruturas

‰Para aceder aos campos de um estrutura, utiliza-se um


ponto (.) depois do nome da estrutura, seguido pelo
nome do campo.
‰Em Fortran90 utilizava-se o carácter ‘%’.

MeusPacientes = patient(1:2)

String = patient(2).name
Teste2b = patient(3).test(2,2)

J. R. Caldas Pinto, J. M. da Costa Sousa 363

4
Acesso a dados em estruturas

‰Acesso a elementos nos campos


ƒ Podem-e extrair várias estruturas de uma só vez. Ex: criação
de um vector de 1x3 com todas as contas (billing):
bills = [patient.billing]

‰Acrescentar campos a estruturas


ƒ Pode-se acrescentar um campo a uma estruturas juntando
esse novo campo. Ex: juntar o número de segurança social
(ssn) a um paciente:
patient(2).ssn = '000–00–0000';

J. R. Caldas Pinto, J. M. da Costa Sousa 364

Apagar campos de estruturas


‰Utiliza-se a função rmfield. Forma básica:
Estrutura2 = rmfield(array,'field')

™Exemplos de aplicação de funções e operadores


mean((patient(2).test)') % test é uma matriz
total=sum([patient.billing]); % billing e um escalar

‰Funções para operar estruturas


ƒ Podem escrever-se funções para qualquer estrutura.
ƒ O programador deve fazer a depuração de erros, i.e., deve
assegurar-se que o código verifica os campos da estrutura.

J. R. Caldas Pinto, J. M. da Costa Sousa 365

5
Exemplo
A(1).nome='Antonio';
A(1).nasc=1975;
A(1).altura=1.76;
A(1).notas=[12 17 14];
A(2).nome='Manuel';
A(2).nasc=1978;
A(2).altura=1.83;
A(2).notas=[13 16 12];

A
1x2 struct array with B = A(1)
fields: nome: 'Antonio'
nome nasc: 1975
nasc altura: 1.7600
altura notas: [12 17 14]
notas

J. R. Caldas Pinto, J. M. da Costa Sousa 366

Exemplo (continuação)
% Acesso a dados utilizando campos dinamicos
vdin='nasc';
A(1).(vdin)=1979;

A(1) =
nome: 'Antonio'
nasc: 1979
altura: 1.7600
notas: [12 17 14]
%Finding the size of Structure Arrays
size(A)
size(A(1).nome)

ans =
1 7

J. R. Caldas Pinto, J. M. da Costa Sousa 367

6
Apagar campos da estrutura
% Deleting Fields from Structures
A(2).erro=10;
A
A = rmfield(A, 'erro')

A = A =
1x2 struct array with fields: 1x2 struct array with fields:
nome nome
nasc nasc
altura altura
notas notas
erro

J. R. Caldas Pinto, J. M. da Costa Sousa 368

Aplicação de funções e operadores


% Applying Functions and Operators
av_alt =
av_alt=mean([A.altura]) 1.7950
mais_velho=min([A.nasc])
meia_notas_de1=mean(A(1).notas) mais_velho =
1978

meia_notas_de1 =
%... notar o que representa: 14.3333
[A.nasc]
[A.notas]

ans =
1979 1978
ans =
12 17 14 13 16 12

J. R. Caldas Pinto, J. M. da Costa Sousa 369

7
Funções com estrututras

function [B] = c2x01f(A)


nome=input(‘Insira o nome que procura:','s');
B=0;
for i=1:length(A),
if strcmp(A(i).nome,nome)
B=A(i);
break
end
end

if isa(B,'struct')==0
disp('Nao se encontra esse nome')
end

J. R. Caldas Pinto, J. M. da Costa Sousa 370

Exemplo de utilização

>> B=c2x01f(A)
Insira o nome que procura: Antonio
B =
nome: 'Antonio'
nasc: 1979
altura: 1.7600
notas: [12 17 14]

>> B=c2x01f(A)
Insira o nome que procura: xxx
Nao se encontra esse nome
B =
0

J. R. Caldas Pinto, J. M. da Costa Sousa 371

8
Organização de dados em estruturas

™ Exemplo:
‰ Uma imagem a cores pode ser codificada:
ƒ Como uma estrutura 1x1 com três campos (imagens de
128x128 correspondentes às componentes R,G,B)
ƒ Uma matriz (128x128) de estruturas com três campos cada
(os escalares R,G,B)

J. R. Caldas Pinto, J. M. da Costa Sousa 372

Estruturas encadeadas
‰Pode ser efectuada com a instrução struct:
A = struct(’data’,[3 4 7; 8 0 1],’nest’,...
struct(’testnum’,’Test 1’, ’xdata’,[4 2 8], ’ydata’,[7 1 6]))

‰Podem também ser criadas com atribuições:


A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = ’Test 2’;
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];

J. R. Caldas Pinto, J. M. da Costa Sousa 373

9
Exemplo

J. R. Caldas Pinto, J. M. da Costa Sousa 374

Células de matrizes (Cell arrays)

‰Uma cell array é uma matriz cujos elementos são


células, com qualquer tipo de elementos.

J. R. Caldas Pinto, J. M. da Costa Sousa 375

10
Criação de cell arrays

‰Podem ser criadas de duas formas:


ƒ Com atribuições
ƒ Com pré-alocação da matriz e posteriores atribuições.

Cell indexing
A(1,1)={[1 4 3;0 5 8;7 2 9]}; Content indexing
A(1,2)={’Anne Smith’}; A{1,1} = [1 4 3; 0 5 8; 7 2 9];
A(2,1)={3+7i}; A{1,2} = ’Anne Smith’;
A(2,2)={–pi:pi/10:pi} A{2,1} = 3+7i;
A{2,2} = –pi:pi/10:pi;

J. R. Caldas Pinto, J. M. da Costa Sousa 376

Outras formas de inicialização


A={123, [12.56 1.4], 'IAP'}

size(A) = [1 3]
A{1}=123; A{2}=[12.56 1.4]; A{2}(2)=1.4
A{3}=TAI

>> c={1 2 3}
c =
[1] [2] [3]

>> c={1, 2, 3}
c =
[1] [2] [3]

>> size(c(1))
ans =
1 1

J. R. Caldas Pinto, J. M. da Costa Sousa 377

11
Mais exemplos

>> size(c{1})
ans =

1 1

>> d=c{1}+2
d =

>> d=c(1)+2
??? Error using ==> +
Function '+' is not defined for values of class 'cell'.

J. R. Caldas Pinto, J. M. da Costa Sousa 378

Sintaxe das cells: uso de ‘{ }’

‰As chavetas ‘{ }’ são construtores tal como os


parêntesis rectos ‘[ ]’ o são para as arrays.

C
B=[{123}, {12.56} ,{‘TAI'}]

C = {[1 2], [3 4]; [5 6], [7 8]}

J. R. Caldas Pinto, J. M. da Costa Sousa 379

12
Exemplo

D(2,:)=[{2 'AI' 12.3} {'TAI', 144}]

D =
[] [] [] [] []
[2] 'AI' [12.3000] 'TAI' [144]

J. R. Caldas Pinto, J. M. da Costa Sousa 380

Pré-alocação de células

‰Criação de uma célula vazia:


B = cell(2,3);
%Utilizar atribuições para prencher células de B.
B(1,3) = {1:3};

‰Obter dados de células:


B(1,1)={12}
A=B(1,1) gera uma “cell”
A=B{1,1} vai buscar o conteúdo 12

J. R. Caldas Pinto, J. M. da Costa Sousa 381

13
Manipulação de células

‰Para obter conteúdos de células devem-se concatenar


expressões de índices. Ex: para obter o elemento (2,2)
da tabela na célula N{1,1} deve-se utilizar:
d = N{1,1}(2,2)
‰Reshaping células de arrays
™Exemplo
A = cell(3,4);
B = reshape(A,6,2);

J. R. Caldas Pinto, J. M. da Costa Sousa 382

Células como listas de variáveis

‰Os ‘:’ juntamente com as chavetas, podem ser tratadas


como variáveis separadas.
™Ex. 1: célula T com vectores. A expressão T{1:5} é
equivalente a uma lista de vectores nas primeiras 5
células de T.
™Ex. 2: C{1:2} representa duas variáveis separadas por
uma vírgula, que podem ser utilizadas:
d = conv(C{1:2}) % Faz a convolução

J. R. Caldas Pinto, J. M. da Costa Sousa 383

14
Células como listas de variáveis

‰Podem ser atribuidas a variáveis das cells nomes


distintos, usando a instrução deal:
[a b]=deal(C{1:2})
ƒ Nota: os argumentos varargin e varargout
permitem a especificação de um número variável de
entradas e saídas. São ambos cell arrays.

J. R. Caldas Pinto, J. M. da Costa Sousa 384

Cell arrays encadeadas

‰Uma célula pode conter outra célula, ou mesmo uma


matriz de células.
‰As células que não contém células são chamadas
células folha (leaf cells).
‰Estas células são criadas e manipuladas da mesma
forma.

J. R. Caldas Pinto, J. M. da Costa Sousa 385

15
Células e estruturas

‰ As células são melhores que as estruturas nas


seguintes aplicações:
1. Quando é necessário aceder a vários campos dos
dados numa única instrução.
2. Quando se quer aceder a subconjuntos dos dados,
como listas separadas por vírgulas.
3. Quando o conjunto de nomes de campos não é fixo.
4. Quando se retiram campos da estrutura de forma
frequente.

J. R. Caldas Pinto, J. M. da Costa Sousa 386

Exemplo
% Inicializaçao dum cell array
A{1,1} = [1 4 3; 0 5 8; 7 2 9];
A{1,2} = 'Anne Smith';
A{2,1} = 3+7i;
A{2,2} = -pi:pi/10:pi;
A
celldisp(A)
cellplot(A)

A =
[3x3 double] 'Anne Smith'
[3.0000+ 7.0000i] [1x21 double]

J. R. Caldas Pinto, J. M. da Costa Sousa 387

16
Exemplo
A{1,1} = [1 4 3; 0 5 8; 7 2 9];
A{1,2} = 'Anne Smith';
A{2,1} = 3+7i;
A{1,1} = A{2,2} = -pi:pi/10:pi;
1 4 3
0 5 8
7 2 9

A{2,1} =
3.0000 + 7.0000i

A{1,2} =
Anne Smith

A{2,2} =
Columns 1 through 7
-3.1416 -2.8274 -2.5133 -2.1991 -1.8850 -1.5708 -1.2566
Columns 8 through 14
-0.9425 -0.6283 -0.3142 0 0.3142 0.6283 0.9425
Columns 15 through 21
1.2566 1.5708 1.8850 2.1991 2.5133 2.8274 3.1416

J. R. Caldas Pinto, J. M. da Costa Sousa 388

Obter dados de células

% Obter dados de células

nome=A{1,2}
a11=A{1,1}(2,2)
Elem1=A{2,2}(1)
LastElement=A{2,2}(length(A{2,2}))

nome =
Anne Smith
a11 =
5
Elem1 =
-3.1416
LastElement =
3.1416

J. R. Caldas Pinto, J. M. da Costa Sousa 389

17
Acesso subconjuntos e apagar células
% Acesso a subconjuntos

B=A(1,1:2)

B =
[3x3 double] 'Anne Smith'

% Apagar células

A{2,1}=[]

A =
[3x3 double] 'Anne Smith'
[] [1x21 double]

J. R. Caldas Pinto, J. M. da Costa Sousa 390

Aplicação de funções e operadores


% Substituir listas de variáveis por células
% aplicando funções e operadores

S=cell(1,2);
function [a,b]=c2x02f(c,d,e)
b=1; c=2; d=3;
a=2*c;
I={b,c,d};
b=d+e;
[S{1:2}]=c2x02f(I{1:3});
[j,k]=deal(S{1:2})

j = 2
k = 5

J. R. Caldas Pinto, J. M. da Costa Sousa 391

18

Вам также может понравиться