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不允许在一个非函数中使用条件的限制(如果你不算那些杂乱、丑陋、低效但有趣的内联版本:)
这个解决方案是通过这个链接提出的(也许还有其他一些地方,但我的谷歌搜索结果显示了这一点,所以我认为最好在这里添加)。
定义一个函数,如iff或ifelse,并将其添加到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);