【发布时间】:2016-09-21 23:48:42
【问题描述】:
我在 mathworks 博客上阅读了 this article 关于 matlab 中的函数式编程的内容,其中有两个辅助函数:
paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};
完成三重奏的明显第三个(并与五个字母的主题保持一致)是:
acces = @(x, field) x.(field);
抛开在 matlab 中以这种方式实现链接是否是个好主意的讨论(注意:octave 默认支持链接),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'
(而 Octave 产生预期的 A = {'john', 'jim'} )
我知道,在 a. 函数如何在 matlab 和 octave 中返回内容,和/或 b. 如何序列由两种语言的单元格和结构生成。
但是,有没有一种编程方式可以让 matlab 执行上述预期操作?
换句话说,有没有办法像 octave 一样定义返回序列的 curly 和 acces 函数(匿名函数 :p 的额外奖励)?
PS。我正在寻找的答案不是微不足道的 “要获取多个参数,请使用 varargout” 一个。
PS2。
【问题讨论】: