2015-04-11 4 views
1

У меня есть это для оператора цикла и switch, который проходит через определенную строку матрицы, оценивает все, что находится в этом элементе, и обновляет на этой основе другую строку той же матрицы. Моя проблема в том, что она, похоже, не оценивает должным образом. Выполняя некоторую ручную отладку, она периодически пропускает определенные условия и не выполняет команду внутри (хотя и не всегда), и я не могу понять, почему ... В любом случае, вот код, извините, что это целая функция. Когда я разделил его на примерную матрицу, а затем на элемент switch/for loop, он работал. Это просто не работает в целом (и мне нужно работать таким образом, то есть рандомизированное)Оператор switch/case не правильно оценивает

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] 

Спасибо!

Martin

ответ

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 
+1

Отлично! Спасибо! У меня было ощущение, что это может быть связано с этим, но я действительно не знал, как это исправить! Выходной сигнал будет таким же ожидаемым и желательным. Благодаря! – Yoddlenod

+0

@Yoddlenod на самом деле, скорее используйте 'round' вместо' floor', возможно, более надежный. – thewaywewalk

Смежные вопросы