matlab: переключить систему с сотнями марок на систему пятизначной маркировки - PullRequest
3 голосов
/ 13 апреля 2011

проблема с переключателем в 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 ]

2 голосов
/ 13 апреля 2011

Вы используете оператор switch как серию if ... elseif ... elseif ... else. Способ переключения состоит в том, что аргумент для переключения должен соответствовать регистру. Вот пример, который делает то, что вы ищете, с помощью оператора 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';

конец

0 голосов
/ 13 апреля 2011

Ваша проблема в том, что в операторе SWITCH-CASE выражение переключения (x в вашем случае) равно по сравнению с каждым выражением случая, чтобы найти совпадение. Ваши выражения все оцениваются как логические результаты (т. Е. 0 или 1), а когда вы сравниваете x с 0 или 1, вы никогда не получите совпадения для x значения 60 или выше. Вот почему результатом вашего оператора switch всегда является выражение otherwise по умолчанию.

Следует отметить, что вы можете полностью избежать оператора switch с помощью простого векторизованного решения, используя функцию FIND :

f = find([-Inf 60 70 80 90] <= x,1,'last');
0 голосов
/ 13 апреля 2011

Если бы я собирался сделать это в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...