Implementación de funciones de "encadenamiento" "rizado" y "acceso" en matlab

Yo leoEste artículo en el blog de mathworks sobre programación funcional en matlab, y dos de las funciones auxiliares fueron:

paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};

El tercero obvio para completar el trío (y de acuerdo con el tema de cinco letras) sería:

acces = @(x, field) x.(field);

Dejando a un lado la discusión sobre si es una buena idea implementar el encadenamiento de esta manera o no en matlab (nota: octava admite el encadenamiento por defecto),paren parece funcionar bien, como se esperaba; sin embargo,curly yacces tener un gran inconveniente; considere el siguiente 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

es decir, lo esperadosecuencia La generación no sucedió.
(tenga en cuenta que este código funciona como se esperaba en Octave, es decir,A = [3,4,5,6] )

Igualmente,acces no produce una secuencia en matlab

>> S = [struct('name', 'john'), struct('name', 'jim')];
>> A = {acces(S, 'name')}
A = 
    'john'

(mientras que Octave produce el esperadoA = {'john', 'jim'} )

Entiendo que la diferencia es probablemente más una cuestión de implementación en términos dea. cómo las funciones devuelven cosas en matlab vs octava, y / osi. cómo se generan las secuencias a partir de celdas y estructuras en los dos idiomas.

Sin embargo, ¿hay una forma programática de hacer que Matlab realice la operación prevista anterior?
En otras palabras, ¿hay alguna manera de definircurly yacces funciones que devuelven una secuencia (bonificación adicional para la función anónima: p) como lo hace la octava?

PD. La respuesta que busco no es la trivial"para obtener múltiples argumentos, use varargout" uno.
PS2Probé esto en Matlab 2013b, por lo que no sé si este comportamiento se ha "solucionado" en versiones posteriores (aunque lo dudo mucho). Probado en el último matlab en línea enhttp://matlab.mathworks.com

Respuestas a la pregunta(1)

Su respuesta a la pregunta