一个函数可以定义为@(x) x^.2
(例如)
但万一,我们有一个函数在不同的时间间隔上采用不同的表示,例如:if abs(x)<3 fun = x^.2 else 0
我们如何使用相同的方式(我的意思是 use @(x)
)来定义这样的函数。
一个函数可以定义为@(x) x^.2
(例如)
但万一,我们有一个函数在不同的时间间隔上采用不同的表示,例如:if abs(x)<3 fun = x^.2 else 0
我们如何使用相同的方式(我的意思是 use @(x)
)来定义这样的函数。
有几种方法可以做到这一点。
乘以假:
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);
正如@Gunther 在上面的评论中提到的那样,可以创建一个通用函数来处理模拟三级运算符的简单条件?丑陋-低效-但有趣的内联版本:)。
该解决方案是通过此链接提供的(也许还有其他一些地方,但 SO 回到了我的谷歌搜索之上,所以认为在这里添加会很好)。 http://www.mathworks.co.jp/matlabcentral/newsreader/view_thread/158054
定义一个函数说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)
这就是我想出的。我具有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 的值生成一个数组,其中第一个值和最后一个值减半。
要扩展隐藏在@RodyOldenhuis 答案中的链接,请查看Functional Programming Constructs。该包提供了一套非常全面的功能结构。作者还在Art of MATLAB 博客上发表了一系列客座文章,展示了这个库背后的许多细节。如果您不想将整个包拉入您的项目,博客文章还包括包中某些功能的匿名单行。