2015-07-08 2 views
1

Когда я запускаю код, который содержит ниже, если x равно 3, он запускает инструкции внутри case 3 и полностью завершает оператор switch. Но я хочу, чтобы он продолжался с случаем 2 и случаем 1. Однако, если x равно 1, он должен просто запускать инструкции в случае 1 (как в случае с коммутатором без разрыва в C/C++).Рабочие случаи/если условия в MATLAB

switch (x) 
      case 3 
       k1= bitxor(k1,bitshift(tail(3),16)); 
      case 2 
       k1= bitxor(k1,bitshift(tail(2),8)); 
      case 1 
       k1= bitxor(k1,tail(1)); 
       k1 = k1*c1; 
      otherwise 
       disp('error'); 
    end 

Каков наиболее эффективный способ запуска этих случаев, как я уже упоминал выше? Я не должен использовать switch-case, это также может быть, если условие.

+0

Что должно произойти в случае 2? (перерыв или продолжение с другими случаями) В случае 3 вы хотите сделать случай 3, затем 2 и 1, вот и все? – Ikaros

+0

В случае 2 он должен запустить регистр 2, и продолжить с case 1 – Bhoke

+1

Это не похоже на 'C/C++'. Из [Matlab doc] (http://mathworks.com/help/matlab/ref/switch.html): «Когда выражение case истинно, MATLAB® выполняет соответствующие инструкции ** и выходит из блока переключателей ** ._ «Если вам действительно нужно оценить другие условия, даже если первый из них _true_, то оператор' switch ... case' не подходит для ваших нужд. – Hoki

ответ

1

Другие решения здесь работают нормально, но в обоих из них вам нужно повторить Переключатель выражений несколько раз. Вы можете определить их порядок в массиве и выполнить сравнение один раз. Затем a cumsum поможет вам включить остальные шкафы:

s = cumsum(x == [3 2 1]); 

if s(1) 
    k1= bitxor(k1,bitshift(tail(3),16)); 
end 

if s(2) 
    k1= bitxor(k1,bitshift(tail(2),8)); 
end 

if s(3) 
    k1= bitxor(k1,tail(1)); 
    k1 = k1*c1; 
end 

if ~any(s) 
    disp('error'); 
end 
+0

Определенно работает! Элегантный способ использования 'cumsum', однако он запутывает код. Сроки показались на моей машине, что использование 'cumsum' составляет около 18% медленнее в исполнении. Для длинной if-chain и когда время выполнения не имеет большого значения, этот подход действительно хорош. – Matt

0

Я бы personnaly пойти на if условия

if x == 3 
    k1= bitxor(k1,bitshift(tail(3),16)); 
    x = 2; 
end 
if x == 2 
    k1= bitxor(k1,bitshift(tail(2),8)); 
    x = 1; 
end 
if x == 1 
    k1= bitxor(k1,tail(1)); 
    k1 = k1*c1; 
end 
if ~any(x == 1:3) 
    disp('error'); 
end 
+0

Спасибо за ваш ответ. Если он наиболее эффективен, я буду использовать его. – Bhoke

+0

Изменение значения 'x' внутри оператора if - это, безусловно, не чистый код, и его следует избегать, потому что это простой побочный эффект. См. [Здесь] (https://en.wikipedia.org/wiki/Side_effect_ (computer_science)). Кроме того, он менее эффективен, чем использование метода в моем ответе. @Bhoke – Matt

+0

И можно добавить, что сравнение в Matlab выполняется с помощью '==' -оператора, а не с одним '=', потому что оно используется для назначения. @Bhoke – Matt

1

Я бы не изменить значение x внутри операторов, если подобные предложенным HamtaroWarrior. Это вызывает побочные эффекты и составляет не чистый код! Лучше использовать || -оператора (OR), чтобы поймать различные случаи, как это:

if(x == 3) 
    k1= bitxor(k1,bitshift(tail(3),16)); 
end 

if((x == 3) || (x == 2)) 
    k1= bitxor(k1,bitshift(tail(2),8)); 
end 

if((x == 3) || (x == 2) || (x == 1)) 
    k1= bitxor(k1,tail(1)); 
    k1 = k1*c1; 
end 

if ~any(x == 1:3) 
    disp('error'); 
end 
Смежные вопросы