switch / case语句未正确评估

时间:2015-04-11 11:42:01

标签: matlab switch-statement

我有这个for循环和switch语句循环遍历矩阵的特定行,评估该元素中的任何内容,并基于此更新同一矩阵的另一行。我的问题是它似乎没有正确评估。做一些手动调试似乎定期跳过某些条件并且不执行命令(虽然不是所有时间),我无法弄清楚为什么...... 无论如何,这是代码,抱歉这是整个功能。当我将它分成一个示例矩阵然后切换语句/ for循环它似乎工作。它只是不起作用(我需要它以这种方式工作,即随机化)

ptpschedule = zeros(3, ntrials);
silenttrialpercent = 0.25;
noSilentTrials = ntrials*silenttrialpercent;
ptpschedule(1,1:ntrials) =  1;
ptpschedule(1,1:noSilentTrials) = 0;
ptpschedule(1,:) = ptpschedule(1,randperm(ntrials));
V = 4; % number of different time points 
x = 0.8; %window for beeps
a = x/V % spacing between each beep to fill in an x second window, in this case 200ms. 
ind = ptpschedule(1,:)>0; % logical index of positive values in the first row
n = nnz(ind);
vals = mod(0.05:a:n-1, x); % values to be randomly thrown in. 
vals(vals==0) = x;
    %This guarantees the same number of each value if n is a multiple of V
ptpschedule(2,ind) = vals(randperm(n)); % fill values in second row in random order

for i = 1:length(ptpschedule)
        switch ptpschedule(2,i)
            case 0.05
                ptpschedule(3,i) = 1
            case 0.25
                ptpschedule(3,i) = 2
            case 0.45
                ptpschedule(3,i) = 3
            case 0.65
                ptpschedule(3,i) = 4
        end

end

有时它会正确评估并输入相应的数字,但有时则不会,只是将其保留为0(但是,当ptpschedule(1,i)== 0时,它应该在第三行中保留相应的值为0)。

10次试验的期望输出为:

[0.00, 0.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00;
 0.00, 0.00, 0.05, 0.45, 0.05, 0.65, 0.45, 0.25, 0.25, 0.65;
 0.00, 0.00, 1.00, 3.00, 1.00, 4.00, 3.00,  2.00, 2.00, 4.00]

谢谢!

马丁

1 个答案:

答案 0 :(得分:2)

您的switch/case结构中存在浮点问题,但由于您的案例非常简单,您可以使用round轻松修复它:

  

Y = round(X)将X的每个元素舍入到最接近的整数。

将切换决策建立在整数上。

for i = 1:length(ptpschedule)
    switch round( ptpschedule(2,i)*100 )
        case 5
            ptpschedule(3,i) = 1
        case 25
            ptpschedule(3,i) = 2
        case 45
            ptpschedule(3,i) = 3
        case 65
            ptpschedule(3,i) = 4
    end
end