2013-08-12 4 views
5

Я регулярно должен экспортировать множество цифр (сотни) в один файл. В настоящее время я используюЭкспорт фигуры MATLAB очень медленный по сравнению с R

print('-dpsc2', outfile, '-append'); 

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

Теперь проблема в том, что я могу достичь максимальной скорости экспорта около 8 цифр в секунду. В R вы можете легко построить около 200 цифр в секунду. Есть ли у кого-нибудь предложения, как (существенно) ускорить возможности экспорта MATLAB?

Jan

+0

Я подозреваю, что это может быть цифра и сюжет * поколение *, а не акт * печати * их, это медленно. По крайней мере, кажется, что вы не выполнили работу, чтобы изолировать время, требуемое для * print *, от времени, необходимого для * генерации * графиков. Я говорю это потому, что вижу, что вы * не * передаете дескриптор вашего вызова для печати (см., Например, аргумент ** handle **, описанный на http://www.mathworks.com/help/ matlab/ref/print.html). Готов поспорить, что если вы публикуете код для генерации графиков, мы можем помочь вам немного ускорить это. Или вы можете использовать MATLAB Profiler самостоятельно. –

+0

@BobGilmore: Нет. Просто распечатать простейшие цифры в postscript занимает от 0.11 до 0.13 секунд даже на быстром компьютере, независимо от того, передаю ли я в дескрипторе 'print' или нет. – horchler

+0

Спасибо @BobGilmore. Собственно, речь идет об экспорте, а не о поколении. Вы можете видеть это, если вы просто экспортируете один и тот же рисунок снова и снова: 'figure; участок (rand (10,10)); tic; для i = 1: 100 print ('- dpsc2', 'test.ps', '-append'); конец; toc' занимает около 10 секунд на моей машине. – Jan

ответ

6

Я чувствую вашу боль. Эта проблема также является причиной того, что функция getframe для генерации фильмов настолько неэффективна. Единственный способ, которым я знаю, это написать более простую функцию, которая вызывает низкоуровневую функцию hardcopy. Вот an example of this for image-based graphics наряду с некоторыми оговорками. hardcopy функция поддерживает как «dpsc2» и опции «Append», что делает print:

hardcopy(gcf,'outfile.ps','-dpsc2','-append'); 

print(gcf,'-dpsc2', 'outfile.ps', '-append'); В то время как занимает около 0,12 секунды, выше занимает всего 0,004 секунды на моей машине!

Если вы делаете help hardcopy, вы не получите очень много информации. Однако, если вам нужно перепроектировать что-либо, вы можете прочитать код для print (edit print) или различные частные функции, которые он вызывает (например, edit private/render, edit private/paperfig, edit private/ghostscript).

+0

Спасибо! Это потрясающе! Для моего кода построения я мог бы фактически заменить мой вызов 'print' вызовом' hardcopy', и все получилось просто отлично. Только одна особенность: чтобы получить белый фон, мне пришлось вызвать команду изменения цвета в качестве последней графической команды прямо перед экспортом. Еще раз спасибо! – Jan

+0

Не уверен, что это применимо к вам, но цикл разворота цикла может помочь вам и вам. – Veridian

+0

@starbox: Не уверен, что это сработает. Я профилировал 'print', и он просто тратит много времени на подготовку фигуры для экспорта. 'hardcopy' представляется командой в самом ее ядре. – Jan

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