MATLAB SCATTER3, УТЕРТВЫ 3 УСТАНОВКА ОСОБЕННОСТИ
-
29-09-2019 - |
Вопрос
Это о том, как Matlab может занять очень разное время, чтобы построить то же самое - и почему.
Я генерирую 10000 баллов в 3D-пространстве:
X = rand(10000, 1);
Y = rand(10000, 1);
Z = rand(10000, 1);
Затем я использовал один из четырех различных методов, чтобы построить это, чтобы создать такое участие так:
Я закрыл все цифры и очистил рабочее пространство между каждым пробегом, чтобы попытаться обеспечить справедливость.
Насос построения с использованием Scatter3:
>> tic; scatter3(X, Y, Z); drawnow; toc
Elapsed time is 0.815450 seconds.
Индивидуальный поговорка с использованием Scatter3:
>> tic; hold on;
for i = 1:10000
scatter3(X(i), Y(i), Z(i), 'b');
end
hold off; drawnow; toc
Elapsed time is 51.469547 seconds.
Насос построения с использованием участка3:
>> tic; plot3(X, Y, Z, 'o'); drawnow; toc
Elapsed time is 0.153480 seconds.
Индивидуальный поговорка с использованием участка3:
>> tic; hold on
for i = 1:10000
plot3(X(i), Y(i), Z(i), 'o');
end
drawnow; toc
Elapsed time is 5.854662 seconds.
Что такое, что Matlab делает за кулисами в «дольше» процедурах, чтобы занять так долго? Каковы преимущества и недостатки использования каждого метода?
Редактировать:Благодаря совету от Ben Voigt (см. Ответы), я включил drawnow
Команды в сроках - но это сделало мало различий в время.
Решение
Основное различие между временем, необходимым для запуска scatter3
и plot3
исходит от того, что plot3
скомпилирован, в то время как scatter3
интерпретируется (как вы увидите, когда редактируете функции). Если scatter3
Было скомпилировано также разница в скорости была бы небольшой.
Основное отличие между временем, необходимым для заговора в цикле против построения в одном, является то, что вы добавляете ручку на сюжет в виде ребенка на оси (посмотрите на вывод get(gca,'Children')
), и вы, таким образом, выращивают сложный массив внутри петли, который мы все знаем, чтобы быть медленными. Кроме того, вы часто называете несколько функций, а не только один раз и понести, таким образом, вызовы от функции накладной.
Пересчет пределов осей не является проблемой здесь. Если вы запустите
for i = 1:10000
plot3(X(i), Y(i), Z(i), 'o');
drawnow;
end
который заставляет MATLAB обновить фигуру на каждой итерации (и который намного медленнее), вы увидите, что пределы осей вообще не меняются (поскольку ограничения осей по умолчанию равно 0 и 1). Однако, даже если оси пределы начались по-разному, для них не потребовалось бы много итераций, чтобы сходиться с этими данными. Сравнить с пропуском hold on
, что делает заговор, займет больше времени, потому что оси пересчитаны на каждом шагу.
Почему эти разные функции? scatter3
Позволяет вам построить точки с различными размерами маркеров и цвета под одной ручкой, пока вам нужен цикл и получите ручку для каждой точки, используя plot3
, который не только дорого с точки зрения скорости, но и с точки зрения памяти. Однако, если вам нужно взаимодействовать с разными точками (или группами пунктов) индивидуально, может быть, вы хотите добавить отдельную запись легенды для каждого, возможно, вы хотите, чтобы вы могли включить их и выключить и т. Д. plot3
В цикле может быть лучшим (хотя и медленным) решением.
Другие советы
Для более быстрого подхода рассмотрим этот третий вариант (напрямую использует строку функции низкой уровня):
line([X,X], [Y,Y], [Z,Z], 'LineStyle','none', 'Marker','o', 'Color','b')
view(3)
Вот некоторые статьи обсуждают вопросы построения производительности:
Ну, если вы хотели контролировать цвет каждую точку, объемные рассеяния были бы быстрее, потому что вам нужно позвонить сюжетом отдельно.
Кроме того, я не уверен, что ваша информация о времени точна, потому что вы не звонили drawnow
, поэтому фактический рисунок мог пройти после toc
.
В итоге:
plot3
самый быстрый, потому что он рисует тот же маркер в разных местахscatter3
Рисует много разных маркеров, поскольку размер и цвет маркера (допускаются) варьируются с каждой точкой- Вызов в цикле действительно медленный, потому что аргумент, анализ и пр. должны проходить несколько раз, кроме того, поскольку точки добавляются к графику, оси должны быть пересчитаны