Implementieren von 'curly'- und' access'-Verkettungsfunktionen in matlab

Ich leseDieser Artike im mathworks-blog über funktionale programmierung in matlab und zwei der helferfunktionen waren:

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

Das offensichtliche dritte, um das Trio zu vervollständigen (und in Übereinstimmung mit dem fünf Buchstaben umfassenden Thema), wäre:

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

Bei der Diskussion, ob es eine gute Idee ist, Verkettungen auf diese Weise in matlab zu implementieren oder nicht (Hinweis: Octave unterstützt standardmäßig Verkettungen),paren scheint erwartungsgemäß gut zu funktionieren; jedoch,curly undacces haben einen großen Nachteil; Betrachten Sie den folgenden Code:

>> C = {1,2,3,4; 2,3,4,5; 3,4,5,6; 4,5,6,7};
>> A = [curly(C, 3, ':')]
A =
     3

d.h. das erwarteteReihenfolg Generation ist nicht passiert.
(Beachten Sie, dass dieser Code in Octave wie erwartet funktioniert, d. h.A = [3,4,5,6] )

Equally,acces erzeugt keine Sequenz in matlab

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

(während Octave das erwartete @ produzieA = {'john', 'jim'} )

Ich verstehe, dass der Unterschied wahrscheinlich eher eine Frage der Implementierung in Bezug auf @ iein wie Funktionen Sachen in Matlab gegen Oktave zurückgeben, und / oder b. wie Sequenzen aus Zellen und Strukturen in den beiden Sprachen generiert werden.

Gibt es jedoch eine programmgesteuerte Möglichkeit, matlab dazu zu bringen, die oben angegebene Operation auszuführen?
it anderen Worten, gibt es eine Möglichkeit, @ zu definierecurly undacces Funktionen, die eine Sequenz zurückgeben (zusätzlicher Bonus für anonyme Funktion: p), wie es die Oktave tut?

PS. Die Antwort, die ich suche, ist nicht das triviale "Verwenden Sie varargout, um mehrere Argumente herauszuholen." einer
PS2.Ich habe dies in Matlab 2013b getestet, daher ist mir nicht bekannt, ob dieses Verhalten in späteren Versionen "behoben" wurde (obwohl ich dies sehr bezweifle). Getestet mit dem neuesten Matlab online unterhttp: //matlab.mathworks.co

Antworten auf die Frage(2)

Ihre Antwort auf die Frage