Matlab 如何在匿名函数中使用条件

Matlab 如何在匿名函数中使用条件,matlab,function,if-statement,inline,anonymous-function,Matlab,Function,If Statement,Inline,Anonymous Function,函数可以定义为@(x)x^.2(例如) 但在这种情况下,我们有一个函数,它在不同的时间间隔上采用不同的表示形式,例如:如果abs(x)有几种方法可以做到这一点 乘以false: g = @(x) (abs(x)<3) .* x.^2 g=@(x)(abs(x)正如上面的评论中提到的@Gunther,一个处理简单条件以模拟第三级运算符的通用函数?:可以创建它来绕过Matlab不允许在一个非函数中使用条件的限制(如果你不算那些杂乱、丑陋、低效但有趣的内联版本:) 这个解决方案是通过这个链接提

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


但在这种情况下,我们有一个函数,它在不同的时间间隔上采用不同的表示形式,例如:
如果abs(x)有几种方法可以做到这一点

乘以false:

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

g=@(x)(abs(x)正如上面的评论中提到的@Gunther,一个处理简单条件以模拟第三级运算符的通用函数?:可以创建它来绕过Matlab不允许在一个非函数中使用条件的限制(如果你不算那些杂乱、丑陋、低效但有趣的内联版本:)

这个解决方案是通过这个链接提出的(也许还有其他一些地方,但我的谷歌搜索结果显示了这一点,所以我认为最好在这里添加)。

定义一个函数,如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)

arrayfun(@(x)ifelse(abs(x)这是我想到的。我有
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”或返回真值的函数,则调用第二个元素并返回其值。如果没有行限定,则返回一个空单元格。元素为空函数而不是值,这样就不会计算不需要的情况

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

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

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

要扩展隐藏在@RodyOldenhuis答案中的链接,请查看。该包提供了一组非常全面的函数构造。作者还做了一系列展示,展示了此库背后的许多细节。如果您不想将整个软件包添加到您的项目中,博客帖子还包括软件包中某些函数的匿名一行程序。

可能重复@Shai:disagree。这个问题是关于单个anon中的多个函数求值,而这是关于anon中的条件求值(有一个重复,我看到了,但我现在找不到它…)更多解释:当你想避免计算未被选中的其他部分时,甚至需要一个合适的函数;例如:
iif(x==0;0;1/x)在这里
1/x`仍然会被计算,即使
x==0
。这是一个函数,matlab仍然希望将所有参数传递给它,因此需要进行计算。避免这种情况的唯一方法(这就是为什么它是最好、正确的方法)是使用单独的函数,如果
@GuntherStruyf:true,则允许多行和正常的
。添加对于
iif()
method:)@GuntherStruyf:ahum的描述是“低效的”。打字很难。这主要是为了避免错误。它看起来像是if/then/else,但实际上在如何执行的问题上不是。但是的,它也低效;)
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
w=arrayfun(@(j) cases({ ...
   @() (j==0 || j==n) @() (-1)^j/2; ...
   'else' @() (-1)^j }), 0:n);