6

一个函数可以定义为@(x) x^.2(例如)

但万一,我们有一个函数在不同的时间间隔上采用不同的表示,例如:if abs(x)<3 fun = x^.2 else 0

我们如何使用相同的方式(我的意思是 use @(x))来定义这样的函数。

4

4 回答 4

17

有几种方法可以做到这一点。

乘以假:

g = @(x) (abs(x)<3) .* x.^2

或定义一个适当的功能(最好的方式真的):

function y = g(x)

    y = zeros(size(x), class(x));

    inds = abs(x)<3;
    y(inds) = x(inds).^2;

end 

或者做凌乱-丑陋-低效-但有趣的事情并使用inline-if

iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}();
g = @(x) iff( ...
    abs(x)<3,  x.^2, ...
        true,  0);
于 2013-07-02T09:01:29.893 回答
0

正如@Gunther 在上面的评论中提到的那样,可以创建一个通用函数来处理模拟三级运算符的简单条件?丑陋-低效-但有趣的内联版本:)。

该解决方案是通过此链接提供的(也许还有其他一些地方,但 SO 回到了我的谷歌搜索之上,所以认为在这里添加会很好)。 http://www.mathworks.co.jp/matlabcentral/newsreader/view_thread/158054

定义一个函数说iffifelse并将其添加到 Matlab 路径。

function result = ifelse(condition,trueResult,falseResult)
    error(nargchk(3,3,nargin));  % check correct number of input args
    if condition
        result = trueResult;
    else
        result = falseResult;
    end

然后像这样使用

predict = arrayfun(@(x) ifelse(x>=0.5,1,0), inputData);

在 OP 的情况下,可以使用这样的东西

arrayfun(@(x) ifelse(abs(x)<3,x^.2,0), data)
于 2014-07-21T19:59:43.770 回答
0

这就是我想出的。我具有cases.m以下定义的功能:

function [ val ] = cases( table )
  [rows,~] = size(table);
  for i = drange(1:rows)
    condition = table{i,1};
    if (ischar(condition) && strcmpi(condition,'else')) || feval(condition)
      val = feval(table{rows,2});
      return
    end
  end
  val={};
end

该函数cases采用具有两列的元胞数组。每个元素都是一个零参数的函数。对于每一行,它采用第一个元素,如果它是字符串“else”或返回真值的函数,则调用第二个元素并返回其值。如果没有行符合条件,则返回一个空单元格。这些元素是空函数而不是值,因此不会评估不需要的情况。

然后我可以写这样的 case 表达式:

w=arrayfun(@(j) cases({ ...
   @() (j==0 || j==n) @() (-1)^j/2; ...
   'else' @() (-1)^j }), 0:n);

这会为从 0 到 n 的值生成一个数组,其中第一个值和最后一个值减半。

于 2015-03-14T10:38:34.670 回答
0

要扩展隐藏在@RodyOldenhuis 答案中的链接,请查看Functional Programming Constructs。该包提供了一套非常全面的功能结构。作者还在Art of MATLAB 博客上发表了一系列客座文章,展示了这个库背后的许多细节。如果您不想将整个包拉入您的项目,博客文章还包括包中某些功能的匿名单行。

于 2016-04-22T18:37:18.993 回答