我有这个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]
谢谢!
马丁
答案 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