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?
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