Я полагаю, что могу понять разницу во времени между этими двумя методами, а также почему люди получают разные относительные скорости.
До версии Matlab 2008a (или версии, близкой к этой версии), дляВ любом коде Matlab основные циклы получили главный удар, потому что интерпретатор (слой между очень читаемым скриптом и реализацией кода более низкого уровня) должен был бы каждый раз заново интерпретировать код через цикл for.
После этого релиза интерпретатор становился все лучше и лучше, поэтому при запуске современной версии Matlab интерпретатор может посмотреть на ваш код и сказать: «Ага! Я знаю, что он делает, позвольте мне немного его оптимизировать» и избегатьудар, который в противном случае потребовался бы при повторной интерпретации кода.
Я ожидал бы, что два способа выполнения умножения матриц будут оцениваться в одно и то же время, поэтому реализация цикла for выполняется быстрее из-за некоторых деталей воптимизация интерпретатора, что мы простые смертные нехочу знать.
Один большой урок, который мы должны извлечь из этого, не все версии равны.Я работаю над несколькими передовыми случаями, используя два дополнения Matlab, SimBiology и Parallel Computing Toolbox, оба из которых (особенно если вы хотите, чтобы они работали вместе) зависят от версии в зависимости от скорости выполнения и время от времени.другие проблемы со стабильностью.Таким образом, я сохраняю три последних выпуска Matlab, проверю, получаю ли я одинаковые ответы для каждой версии, и иногда буду откатываться на более раннюю версию, если обнаружу проблемы с некоторыми функциями.Это, вероятно, излишне для большинства людей, но дает представление о различиях версий.
Надеюсь, это поможет.
Правки:
Чтобы уточнить, векторизация кода по-прежнему важна.Но с учетом сценария, подобного следующему:
x_slow = zeros(1,1e5);
x_fast = zeros(1,1e5);
tic;
for i=1:1e5
x_slow(i) = log(i);
end
time_slow = toc; % evaluates for me in .0132 seconds
tic;
x_fast = log(1:1e5);
time_fast = toc; % evaluates for me in .0055 seconds
Несоответствие между time_slow и time_fast уменьшилось в последних нескольких версиях на основе улучшений в интерпретаторе.Я видел пример, который, как мне кажется, был 2000a против 2008b, но это мое воспоминание.
Возможно, есть еще кое-что, о чем говорили Оли и Юк.Часто существует разница между time_1 и time_2 в:
tic; x = log(1:1e5); time_1 = toc
tic; x = log(1:1e5); time_2 = toc
Таким образом, проверка миллиона оценок против одной оценки полезна, в зависимости от того, где в памяти находится x (в кеше или нет).
Надеюсь, это поможет снова.