在matlab中切换案例问题
将百马系统切换为五级标记系统。
function f=fjou(x)
switch x
case x>=90
f='5';
case x>=80&x<90
f='4';
case x>=70&x<80
f='3';
case x>=60&x<70
f='2';
otherwise
f='1';
end
如果参数> 60,结果总是“1”,为什么?
答案 0 :(得分:2)
你正在使用switch语句,就像一系列if ... elseif ... elseif ... else。 switch的工作方式是switch的参数必须与case匹配。下面是一个使用switch语句执行所需操作的示例。
switch floor(x/10)
case 10,
f='5';
case 9,
f='5';
case 8,
f='4';
case 7,
f='3';
case 6,
f='2';
otherwise
f='1';
端
答案 1 :(得分:0)
如果我要在R中执行此操作,我只需使用cut
函数。我在MATLAB中找不到等价物,但这是一个减少版本。 (没有双关语!)
function y = cut(x, breaks, right)
%CUT Divides the range of a vector into intervals.
%
% Y = CUT(X, BREAKS, RIGHT) divides X into intervals specified by
% BREAKS. Each interval is left open, right closed: (lo, hi].
%
% Y = CUT(X, BREAKS) divides X into intervals specified by
% BREAKS. Each interval is left closed, right open: [lo, hi).
%
% Examples:
%
% cut(1:10, [3 6 9])
% cut(1:10, [-Inf 3 6 9 Inf])
% cut(1:10, [-Inf 3 6 9 Inf], false)
%
% See also: The R function of the same name.
% $Author: rcotton $ $Date: 2011/04/13 15:14:40 $ $Revision: 0.1 $
if nargin < 3 || isempty(right)
right = true;
end
validateattributes(x, {'numeric'}, {});
y = NaN(size(x));
if right
leq = @gt;
ueq = @le;
else
leq = @ge;
ueq = @lt;
end
for i = 1:(length(breaks) - 1)
y(leq(x, breaks(i)) & ueq(x, breaks(i + 1))) = i;
end
end
您的用例是
cut(1:100, [-Inf 60 70 80 90 Inf], false)
答案 2 :(得分:0)
您的问题是,在SWITCH-CASE statement中,切换表达式(在您的情况下为x
)比较到每个案例表达式以查找匹配项。您的案例表达全部评估为logical结果(即0或1),当您将x
与0或1进行比较时,您将从不获取x
值为60或以上的匹配项。这就是为什么switch语句的结果始终是默认的otherwise
表达式。
应该注意的是,您可以使用函数FIND完全避免使用带有简单向量化解决方案的switch语句:
f = find([-Inf 60 70 80 90] <= x,1,'last');