Implementando funções de encadeamento 'curly' e 'access' no matlab
Eu liEste artigo no blog mathworks sobre programação funcional no matlab, e duas das funções auxiliares foram:
paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};
O terceiro óbvio para completar o trio (e de acordo com o tema de cinco letras) seria:
acces = @(x, field) x.(field);
Colocando de lado a discussão sobre se é uma boa idéia implementar o encadeamento dessa maneira ou não no matlab (nota: oitava suporta encadeamento por padrão),paren
parece funcionar bem, como esperado; Contudo,curly
eacces
tem uma grande desvantagem; considere o seguinte código:
>> C = {1,2,3,4; 2,3,4,5; 3,4,5,6; 4,5,6,7};
>> A = [curly(C, 3, ':')]
A =
3
ou seja, o esperadoseqüência geração não aconteceu.
(observe que esse código funciona conforme o esperado na oitava, ou seja,A = [3,4,5,6]
)
Igualmente,acces
não produz uma sequência no matlab
>> S = [struct('name', 'john'), struct('name', 'jim')];
>> A = {acces(S, 'name')}
A =
'john'
(enquanto Octave produz o esperadoA = {'john', 'jim'}
)
Entendo que a diferença é provavelmente mais uma questão de implementação em termos deuma. como as funções retornam coisas no matlab x oitava e / oub. como as seqüências são geradas a partir de células e estruturas nos dois idiomas.
No entanto, existe uma maneira programática de fazer com que o matlab execute a operação pretendida acima?
Em outras palavras, existe uma maneira de definircurly
eacces
funções que retornam uma sequência (bônus extra para função anônima: p) como a oitava faz?
PS2.Eu testei isso no Matlab 2013b, por isso não sei se esse comportamento foi "corrigido" em versões posteriores (embora eu duvide muito). Testado no mais recente matlab online emhttp://matlab.mathworks.com