Реализация «фигурных» и «доступных» функций «сцепления» в matlab

Я читаюЭта статья в блоге mathworks о функциональном программировании в matlab и двух вспомогательных функциях:

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

Очевидный третий для завершения трио (и в соответствии с темой из пяти букв) будет:

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

Оставим обсуждение того, является ли хорошей идеей реализовать цепочку таким образом или нет в Matlab (примечание: октава поддерживает цепочку по умолчанию),paren кажется, работает хорошо, как и ожидалось; тем не мение,curly а такжеacces имеют большой недостаток; рассмотрим следующий код:

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

то есть ожидаемыйпоследовательность поколение не произошло.
(обратите внимание, что этот код работает, как и ожидалось в Octave, т.е.A = [3,4,5,6] )

В равной степени,acces не производит последовательность в Matlab

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

(тогда как октава производит ожидаемыйA = {'john', 'jim'} )

Я понимаю, что разница, вероятно, больше связана с реализацией с точки зренияа. как функции возвращают вещи в matlab против октавы и / илиб. как последовательности генерируются из ячеек и структур на двух языках.

Однако существует ли программный способ заставить matlab выполнить вышеуказанную операцию?
Другими словами, есть ли способ определитьcurly а такжеacces функции, которые возвращают последовательность (дополнительный бонус для анонимной функции: p), как октава?

PS. Ответ, который я ищу, не тривиален"чтобы получить несколько аргументов, используйте varargout" один.
PS2.Я проверил это на Matlab 2013b, поэтому я не знаю, было ли это поведение «исправлено» в более поздних версиях (хотя я сильно сомневаюсь в этом). Проверено на последнем матлабе онлайн наhttp://matlab.mathworks.com

Ответы на вопрос(1)

Ваш ответ на вопрос