Реализация «фигурных» и «доступных» функций «сцепления» в 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), как октава?
PS2.Я проверил это на Matlab 2013b, поэтому я не знаю, было ли это поведение «исправлено» в более поздних версиях (хотя я сильно сомневаюсь в этом). Проверено на последнем матлабе онлайн наhttp://matlab.mathworks.com