我正在尝试编写一个匿名函数来生成字符串,用于绘制多个数字中的多个变量。
我想找到一种方法,可以让我实现像
这样的东西vtext=@(v) horzcat('X1,',v,'1,''.'',X2,',v,'2,''.'',X3,',v,'3,''.''');
makevtext=@(varargin) vtext(varargin{:});
[atext,btext,ctext]=makevtext('a','b','c');
生成字符串:
atext = X1,a1,'.',X2,a2,'.',X3,a3,'.'
btext = X1,b1,'.',X2,b2,'.',X3,b3,'.'
ctext = X1,c1,'.',X2,c2,'.',X3,c3,'.'
我将用它来生成a,b和c的多个图。我正在使用匿名函数,因为我希望能够在浏览数据时轻松更改我使用的变量(例如,如果我想要查看a,d和e的数字,或者vtext
还包括X4和a / d / e4等),但不必经过我的代码并在每次执行此操作时更改20个图表的参数。 对于上下文,1,2,3,4,...是不同类型的分布(Pareto,指数等),而a,b,c,d,e,...是直方图计数,PDF ,CDF,超越和许多其他衍生功能。
现在,如果我运行atext=makevtext('a')
,上面的代码就有效,但是[atext,btext]=makevtext('a','b')
给了我一个"太多的输入参数"错误。如果我用上面的第2行替换(只需删除" {:}"):
makevtext=@(varargin) vtext(varargin);
然后[atext,btext]=makevtext('a','b')
给了我一个"太多的输出参数"错误,但我也可以(错误地):
[atext] = makevtext('a')
atext =
1x5 cell array
'X1,' 'a' '1,'.',X2,' 'a' '2,'.''
[abtext] = makevtext('a','b')
atext =
1x7 cell array
'X1,' 'a' 'b' '1,'.',X2,' 'a' 'b' '2,'.''
我知道它应该可以同时使用varargin并在匿名函数中有多个输出,但是无法找到使用它们的任何示例。有没有办法做到这一点,还是我需要完全使用不同的方法?
答案 0 :(得分:0)
问题中的makevtext
函数不会向vtext
添加任何内容,它只返回其输出。我们需要做更多的工作来获得多个输出。并使用多个输入生成不同的字符串。
首先,cellfun
可用于将vtext
应用于varargin
中的每个元素:
cellfun(vtext,varargin,'UniformOutput',false)
这将返回一个新的单元格数组,每个元素都由vtext
创建一个字符串。现在我们需要将其拆分为多个输出。索引像这样的单元格数组:A{:}
将所有元素输出为逗号分隔列表。 deal
将此转换为多个输出(请参阅https://blogs.mathworks.com/loren/2007/01/31/multiple-outputs/)。因此我们得到了这段代码:
>> vtext=@(v) horzcat('X1,',v,'1,''.'',X2,',v,'2,''.'',X3,',v,'3,''.''');
>> makevtext=@(varargin) deal(cellfun(vtext,varargin,'UniformOutput',false){:});
>> [atext,btext,ctext]=makevtext('a','b','c')
atext = X1,a1,'.',X2,a2,'.',X3,a3,'.'
btext = X1,b1,'.',X2,b2,'.',X3,b3,'.'
ctext = X1,c1,'.',X2,c2,'.',X3,c3,'.'
这适用于Octave,但它可能在MATLAB中不起作用,因为MATLAB不能让你直接索引函数的返回。它可能需要更详细的版本:
A{:}
相当于subsref(A,substruct('{}',{':'}))
。因此我们可以这样做:
makevtext=@(varargin) deal(subsref(cellfun(vtext,varargin,'UniformOutput',false),substruct('{}',{':'})));