Вопрос

Это о том, как Matlab может занять очень разное время, чтобы построить то же самое - и почему.

Я генерирую 10000 баллов в 3D-пространстве:

X = rand(10000, 1);
Y = rand(10000, 1);
Z = rand(10000, 1);

Затем я использовал один из четырех различных методов, чтобы построить это, чтобы создать такое участие так:

alt text

Я закрыл все цифры и очистил рабочее пространство между каждым пробегом, чтобы попытаться обеспечить справедливость.

Насос построения с использованием 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 Рисует много разных маркеров, поскольку размер и цвет маркера (допускаются) варьируются с каждой точкой
  • Вызов в цикле действительно медленный, потому что аргумент, анализ и пр. должны проходить несколько раз, кроме того, поскольку точки добавляются к графику, оси должны быть пересчитаны
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top