2015-04-15 4 views
1

Я использую MATLAB R2014a и пишу программу, которая будет обрабатывать миллионы точек данных. Проблема в том, что время выполнения увеличивается до абсурдной суммы, когда она проходит отметку в сотни тысяч, и даже тогда она больше, чем должна быть. Это связано с тем, что у меня есть два оператора if, которые содержат или схему. Я проверил его с помощью простого кода и обнаружил, что схема или схема занимают невероятно долгое время по сравнению с разрывом или схемой на две разные статусы.Слишком длительное время, используя оператор if или схему в MATLAB

Следующий код является довольно быстро и использует два, если утверждения вместо или цепи:

dataBlock = 500000; 
    num_loops = 1; 
    while num_loops <= 2000000 
     if num_loops ==200000 
      disp('200000'); 
     end 
     if num_loops == dataBlock 
      disp('num_loops = dataBlock'); 
      dataBlock = dataBlock + 500000; 
     end 
     num_loops = num_loops+1; 
    end 

Следующий код является таким же, как показано выше, но использует или цепь, а не два, если заявления. Она работает невероятно медленно, даже если я обеспечил более частый случай записывается первым:

dataBlock = 500000; 
    num_loops = 1; 
    while num_loops <= 2000000 
     if num_loops == dataBlock|| num_loops == 200000 
      disp('entered or cuircit'); 
      if num_loops == dataBlock 
       disp('num_loops = dataBlock'); 
       dataBlock = dataBlock + 500000; 
      end 
      num_loops = num_loops+1; 
     end 
    end 

Когда я понял, что разделение схемы на два, если заявления были быстрее, я пытался, что в моем исходном коде, но он не сделал похоже, имеют какое-то влияние. Возможно, потому, что код, который я использую, более сложный и длительный, чем те, которые я использовал для тестирования и предоставили здесь.

Кто-нибудь знает, почему длительность времени, требуемого для запуска программы с помощью схемы или так длинна? Любые идеи для возможной альтернативы?

+0

FYI «цепь», на которую вы ссылаетесь, должна называться логической операцией ИЛИ. Возможно, вы смутили его с помощью [короткого замыкания] (http://www.mathworks.com/help/matlab/ref/logicaloperatorsshortcircuit.html#bt_0nai-1). – Setsu

+0

Кроме того, две версии не делают то же самое; вторая версия называет 'disp' больше, чем первая. Удаление вызовов 'disp' дало мне приблизительные значения времени. Кроме того, не называйте 'disp', когда вы синхронизируете материал; запись в командное окно является нетривиальной и существенно повлияет на производительность. – Setsu

ответ

1

Вы увеличиваете num_loops внутри своего первого if. Эта переменная всегда равна 1. Перепишите эту строку: num_loops = num_loops+1; незадолго до последнего end. В противном случае ваш второй алгоритм имеет супер-цикл (без конца).

+0

Спасибо, что указал на ту тупую ошибку. Я хотел написать так, как вы описали. Я пытался быстро написать простой код, который сделал что-то похожее на то, что делает мой сложный код, чтобы использовать его в качестве примера. Переписывание кода примера дает то, что вы ожидаете: короткое время выполнения. Что только заставляет меня задаться вопросом, почему мой оригинальный код тратит столько времени на схему, если я даже не могу воспроизвести проблему! Считаете ли вы, что это может быть из-за того, что в моем исходном коде значения, используемые в инструкции, относятся к значениям, поэтому MATLAB должен тратить дополнительное время на вызов этих значений? благодаря! –

+0

Сомневаюсь, что это со временем будет иметь такое значение. –

+0

Спасибо за вашу помощь! –