繁体   English   中英

带有可变数量的输入和输出参数的Matlab匿名函数

[英]Matlab anonymous function with variable number of input and output arguments

我试图编写一个匿名函数来生成用于在多个图中绘制多个变量的字符串。

我想找到一种方法,可以让我实现类似

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并在匿名函数中具有多个输出,但是找不到同时使用这两个示例的任何示例。 实际上有什么方法可以执行此操作,还是我需要完全使用其他方法?

问题中的makevtext函数不会向vtext添加任何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('{}',{':'})));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM