matlab:将百分制转换为五级标记系统

时间:2011-04-13 12:06:42

标签: matlab

在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”,为什么?

3 个答案:

答案 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');