在MATLAB中按顺序运行情况/条件

时间:2015-07-08 18:37:03

标签: matlab

当我运行包含以下内容的代码时,如果x为3,它将运行case 3中的指令并完全退出switch语句。但我希望它继续使用案例2和案例1.但是,如果x为1,它应该只运行案例1中的指令(就像在C / C ++中没有中断的switch-case)。

    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它也可以是条件。

3 个答案:

答案 0 :(得分:1)

我不会在 HamtaroWarrior 提出的if语句中更改x的值。这会导致副作用,不干净代码!更好地使用|| - 运算符(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

答案 1 :(得分:1)

此处的其他解决方案工作正常,但在这两种解决方案中,您需要多次重复切换表达式。您可以在数组中定义它们的顺序并进行一次比较。然后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

答案 2 :(得分:0)

我会亲自去寻找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