函数可以定义为@(x) x^.2
(例如)
但是在某种情况下,我们有一个函数可以在不同的时间间隔上进行不同的表示,例如:if abs(x)<3 fun = x^.2 else 0
我们如何使用相同的方式(我的意思是使用@(x)
)来定义这样的函数。
答案 0 :(得分: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);
答案 1 :(得分:0)
正如@Gunther在上面的评论中提到的,一个处理简单条件以模仿第三级运算符的通用函数?:可以创建环绕Matlab不允许在函数内部条件的限制(如果你不&# 39;计算那个混乱,效率低但有趣的内联版本:)。
解决方案是通过这个链接呈现的(也许还有其他几个地方,但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)
答案 2 :(得分: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'或返回true值的函数,则调用第二个元素并返回其值。如果没有行符合条件,则返回空单元格。元素是nullary函数而不是值,因此不会评估不需要的情况。
然后我可以编写像这样的案例表达式:
w=arrayfun(@(j) cases({ ...
@() (j==0 || j==n) @() (-1)^j/2; ...
'else' @() (-1)^j }), 0:n);
这将生成一个数组,其值为0到n,第一个和最后一个值减半。
答案 3 :(得分:0)
要扩展隐藏在@ RodyOldenhuis的答案中的链接,请查看Functional Programming Constructs。该软件包提供了一套非常全面的功能结构。作者还做了一系列guest posts on the Art of MATLAB blog,展示了这个库背后的许多细节。如果您不想将整个软件包放入您的项目中,那么博客帖子中还包含了软件包中某些功能的匿名单行。