Показаны сообщения с ярлыком научное. Показать все сообщения
Показаны сообщения с ярлыком научное. Показать все сообщения

История создания алгоритма Быстрого Преобразования Фурье



9 коммент.
Сразу после публикации статьи Кули и Тьюки [1], в которой описывался алгоритм вычисления быстрого преобразования Фурье (БПФ, FFT, Fast Fourier Transform), к авторам начали приходить письма с различными отзывами. Одни писали, что их новый революционный алгоритм распахнул невиданные горизонты для обработки сигналов и изображений, и теперь любая задача по плечу. Другие говорили [2], что алгоритм давным-давно известен и используется, так что их статья - лишь повтор того, что есть.
И те, и другие были по-своему правы.

Следует заметить, что время публикации статьи Кули и Тьюки [1] совпало с бурным развитием вычислительной техники, когда всё больше и больше задач решались на ЭВМ. В 1965 году, тем не менее, все высокоскоростные компьютеры были забиты заданиями под завязку. Более того, в те годы начали активно разрабатываться АЦП, которые позволяли вводить информацию в ЭВМ со скоростью нескольких тысяч отсчётов в секунду. Это означало, что теперь можно обрабатывать сигнал цифровым способом вместо использования аналоговых устройств. В свою очередь, потребовались эффективные алгоритмы обработки сигналов и изображений, многие из которых используют преобразование Фурье. Поэтому появление нового алгоритма, сулившего ускорить вычисление дискретного преобразования Фурье в $N/\log_2(N)$ , было очень кстати.

Создание алгоритма

По рассказам одного из авторов алгоритма, Джеймса Кули [3], всё началось в конце 1963 года. Джеймс Кули был нанят в IBM Thomas J. Watson Research Center в Yorktown Heights, что в Нью-Йорке. Кули работал над своим собственным проектом, когда к нему обратился Ричард Гарвин (Richard Garwin) и показал некоторые заметки Джона Тьюки (John Tukey) об алгоритме, который теоретически способен вычислять быстрое преобразование Фурье со скоростью, пропорциональной $N\log_2(N)$, а не $N^2$. Гарвин, в отличие от Кули, хорошо понимал всю важность этого алгоритма и его огромную практическую значимость, и поэтому настаивал на разработке этого алгоритма.

``- Позже, - вспоминает Кули [2]. - я выяснил, что Гарвин был значительно более заинтересован в улучшении дистанционного сейсмического мониторинга ядерных взрывов; русские едва ли согласились бы на проведение инспекций на их территории. Гарвин так же видел необходимость в разработке методов раннего акустического обнаружения подводных лодок. Как и многие другие, я не считал это важным, поэтому поставил задаче разработки алгоритма БПФ приоритет ниже, чем собственным исследованиям. Тем не менее, под напором авторитета Гарвина и его постоянных телефонных звонков, я написал алгоритм для вычисления трёхмерного БПФ.''

История БПФ

Перед публикацией нужно было проверить, является ли идея алгоритма новой, и Кули решил посоветоваться с Джоном Тьюки. Тьюки посоветовал просмотерть несколько статей, в одной из которых [4] описывался очень похожий метод, скорость которого была несколько меньше. Было понятно, что идея их алгоритма в целом не нова, и это заставило Кули глубже изучить историю БПФ. Его непосредственный начальник, Гарвин, обратился к своему коллеге, профессору Томасу (Professor L.H. Thomas), который был в своё время научным руководителем Кули в институте. Томас дал свою опубликованную статью [5], в которой описывалось вычисление рядов Фурье, которые он проделал в 1948 году в IBM на табуляторе с перфокартами. По словам Томаса, он просто пошёл в библиотеку и взял справочник [6]. Методы, опубликованные в этом справочнике, позволяли вычислять ряды Фурье и уменьшать объёмы вычислений используя свойство симметрии тригонометрических функций.

Вскоре после публикации [1] Кули получил письмо от Филипа Рудника из Института Океанографии в Санн-Диего, Калифорния. Рудник сказал, что сам реализовал подобный алгоритм, используя метод из [7]. Статья Рудника с улучшенным вариантом такого метода вышла [8] чуть позднее статьи Кули и Тьюки - он не решился публиковать её сразу.
Оказалось, что приёмы, лежащие в основе БПФ, были опубликовы ещё раньше. В том же справочнике Стампффа [6] нашлась ссылка на более ранние работы Рунге и Кёнига [9]. В той работе так же использовался метод ``бабочки'' (Метод ``бабочки'', butterfly, заключается в использовании сделанных вычислений для получения соседних значений сложением или вычитанием уже полученных) для ускорения вычислений и контроля ошибок.

Кули написал статью [10], в которой приводилась, как он полагал, полную историю предшествующих похожих алгоритмов вычисления БПФ вплоть до работ Рунге [9]. Однако пыль веков скрывала в себе много интересного, и вскоре Кули получил ссылку от коллеги [11] на ещё более ранюю работу по вычислению БПФ. Это была глава книги великого Карла Фридриха Гаусса [12]. В этой главе, написанной на неоклассической латыни, приводились основные соображения алгоритма БПФ. Гаусс применял разновидность интерполяции по Лагранжу, и это могло привести его к возможности сокращения количества операций при быстром преобразовании. Позже были опубликованы работы [13,11], в которых приведён краткий перевод работы Карла Гаусса, предвосхтившей БПФ, а так же упомянуты другие работы, посвящённые БПФ.

Выводы

Из всей этой истории читатель может извлечь ценные выводы:

1. Очевидно, что понимание важности и быстрая публикация значительных достижений очень и очень важны.
2. Аккуратное отношение к старой литературе может принести большую пользу. Награды за выдающиеся достижения должны предшествовать анализу старых публикаций и книг.
3. Общение между математиками, инженерами и специалистами прикладных областей является крайне плодотворным.
4. Не публикуйте статьи на нео-классической латыни.

Литература

1
Cooley J.W. and Tukey J.W. An algorithm for the machine calculation of the complex fourier series. Mathematics Computation, 19:297-301, 1965.
2
James W. Cooley. The re-discovery of the fast fourier transform algorithm. Mikrochimica Acta, III:33-45, 1987.
3
J.W. Cooley. How the FFT gained acceptance. Proceedings of the Association for Computing Machinery Conference on the History of Scientific and Numeric Computation, Princeton, NJ, pages 10-13, 1987.
4
J. Good I. J. Royal Statist. Soc.,, 20:361, 1958.
5
L. H. Thomas. Applications of Digital Computers, chapter Using a Computer to Solve Problems in Physics. Boston: Ginn and Company, 1963.
6
K. Stumpff. Grundlagen und Methoden der Periodenforschung, Tafeln und Aufgaben zur Harmonischen Analyse und Periodogrammrechnung. Springer, Berlin, 1939.
7
G. C. Danielson and C. Lanczos. Some improvements in practical fourier analysis and their application to x-ray scattering from liquids. J. Franklin Inst. 233, Pergamon Journals, Ltd., pages 365-80, 1942.
8
Philip Rudnick. Note on the calculation of fourier series. Math. Comp., Vol. 20, No.3:429-430, July 1966.
9
C. Runge and H. Konig. Vorlesungen uber Numerisches Rechnen (Die Grundlehren der Mathematischen Wissenschaften, Band XI). Springer, Berlin, 1924.
10
J.W. Cooley, P.A. Lewis, and P.D. Welch. An algorithm for the machine calculation of complex fourier series. IEEE Trans. Audio Electroacoustics, AU-15:76, 1967.
11
H.H. Goldstine. A History of Numerical Analysis from the 16th Through the 19th Century. Springer-Verlag, New York, Heidelberg, and Berlin, 1977.
12
C.F. Gauss. Nachla: Theoria interpolationis methodo nova tractata. (Carl Friedrich Gauss, Werke, Band 3), Konigliche Gesellschaft der Wissenschaften, Gottingen, pages 265-303, 1866.
13
M.T. Heideman, D.H. Johnson, and C.S. Burrus. Gauss and the history of the fast fourier transform. The ASSP Magazine, Vol. 1, No. 4:14-21, Oct. 1984.
Читать далее

Вырываем список книг для чтения из zotero с мясом, Tcl-ем и SQlite-ом



3 коммент.
В этом посте мы продолжим беспощадную борьбу с кошмарным интерфейсом недо-системы управления библиографией под названием zotero с целью получить список книг для чтения. Даже для такой простой вещи, как получения списка книг, находящихся в базе zotero, нужно брать в руки автоген, скальпель и кувалду. Линуксоидов этим, конечно, не напугать, но маководов от экранов просьба удалиться во избежание.

В этом посте мы безтрепетной рукой вырвем с мясом из зотеры список книг, засунутых туда через графический, скажем так, интерфейс. В этом нам поможет язык Tcl (Тикль), Debian и SQLite3.

Читать далее

Maxima: компьютерная алгебра и символьные вычисления в Linux



25 коммент.
Чудище обло, озорно, огромно, стозевно и лаяй.

В начало поста вынесен эпиграф к книге «Путешествие из Петербурга в Москву» Александра Николаевича Радищева (1749-1802), что в переводе означает "Чудовище тучное, гнусное, огромное, стозевное и лающее". Это, пожалуй, самый точный* "портрет" системы символьных вычислений Maxima после логичности, простоты и превосходной документации Maple.

Читать далее

GNU Octave: система численных математических расчётов и какая от неё польза в народном хозяйстве



35 коммент.
Расчёты бывают разной сложности: проверить, сколько будет 6*6, посчитать сумму стоимости товаров в чеке, решить систему линейных уравнений для домашней работы, или, скажем, рассчитать деградацию волнового фронта при прохождении многослойной турбулентной атмосферы. Если первые два примера можно посчитать на любом калькуляторе, то линейные уравнения решают инженерные калькуляторы. Последний пример могут решить только системы численных расчётов, которые используют для научных исследований - например GNU Octave. Вот о ней-то в этом посте и рассказывается.
Читать далее

FITS формат в Linux



29 коммент.
Так как мой новый проект посвящён адаптивной оптике для телескопов, мне приходится иметь дело с астрономическими данными. Астрономы не хранят снятные данные в JPG или TIFF - у них есть свой формат, который называется FITS (Flexible Image Transport System). FITS это намного больше, чем просто формат изображений: это формат, позволяющий хранить многомерные массивы данных. О том, как работать с FITS, и посвящена эта заметка.
Читать далее

Создание постеров с beamerposter



19 коммент.
Некоторое время назад был опубликован пост об Inkscape, в котором уважаемые комментаторы попеняли автору на то, что не использовал для постеров beamerposter. Автор взял на себя очередное социалистическое обязательство в этот самый beamerposter потыкать палочкой. Результаты оной деятельности можно
Читать далее

Особенности документации Doxygen для MATLAB скриптов



2 коммент.
Документирование программ MATLAB в Doxygen имеет свою специфику, поэтому нам пригодятся далеко не все возможности Doxygen. Далее следует краткое описание основных моментов при комментировании кода MATLAB.
Читать далее

Генерация документации с помощью Doxygen к программам MATLAB



15 коммент.
Doxygen это кроссплатформенная система документирования исходных текстов - то есть, пишем в коде нашей программы комментарии в стандартизированной форме, скармливаем это Doxygen и на выходе имеем документацию по использованию нашей программы. Doxygen, разумеется, ни в коем разе не отменяет написание нормальной документации к программам, однако поможет быстро вспомнить вам, что делает написанная вами программа до Грюнвальдской битвы. И использовать это чудо можно не только для С/C++, но даже для программ на MATLAB, для чего есть описываемый далее небольшой перловый костылик.
Читать далее

Тестирование быстродействия MATLAB и GNU/Octave



31 коммент.
Для работы мне нужно моделировать искажение света атмосферой и компенсировать его - в этом, собственно, основная идея адаптивной оптики и состоит. Ответ на вопрос "как это сделать" может занять пару томов в книге, и чтобы искать ответ было проще, люди создают симуляторы. После долгих раздумий о том, на каком языке его писать, я таки начал писать симулятор на Матлабе - это то, что лучше всего мне известно.
Читать далее

GraphViz: примеры создания графов и взаимосвязей



20 коммент.
Есть много типов данных, которые можно и нужно представить наглядно в виде зависимости одного от другого. Это и генеалогическое дерево, и взаимосвязь проектов друг с другом, и многое другое. Это всё можно вручную отрисовывать в Inkscape, а можно последовать UNIX-way и доверить это GraphViz. Немного своих находок и зарубок на память - пример возможностей GraphViz.


Предыстория
В общем, GraphViz это язык управления взаимосвязями - не нужно их чертить руками, их нужно логически описать на языке программирования и доверить работу по вычерчиванию графов GraphViz. В первый раз я начал задумываться об этом тогда, когда мне пришлось построить взаимосвязи меду своими проектами - было подспудное ощущение, что я что-то пропустил и нужно создать ещё проекты.

Сначала я использовал Kmindmap, но его возможности по построению множественных взаимосвязей на разных уровнях очень ограничены. Inkscape это, конечно, ручная работа, что при числе проектов более трёх десятков совсем не весело. И хотелось бы всё это интегрировать с LaTeX... После недолгих скитаний я понял, что изучение
GraphViz сулит много хорошего и не так сложен в освоении.

GraphViz вообще пригоден для всего, что только имеет смысл представлять в виде графов - любые процессы, сети и взаимосвязи. В сочетании с любым скриптовым языком это прекрасный инструмент для анализа и визуализации практически любой информации.

Граф при визуализации может быть представлен как иерархически (dot), так и по алгоритму минимизации энергии (energy minimized), когда узлы располагаются максимально компактно, насколько это возможно, не нарушая наглядность (neato). В общем, если информацию можно представить в виде направленного или ненаправленного графа, GraphViz с этим легко справится.


Установка и первые шаги с GraphViz
GraphViz есть в каждом уважающем себя дистрибутиве, и ставится пакетной системой на раз:
# aptitude install graphviz
Единственное, что следует отметить, что GraphViz имеет кучу зависимостей, так что его сборку лучше доверить вашим дистростроителям.

Но допустим, что вы его успешно собрали или просто поставили из пакетного менеджера своего дистрибутива - что дальше? А дальше делаем быстрый старт: открываем свой любимый текстовый редактор и вставляем в него например вот это:
digraph G{
Рождение->Юность->Зрелость->Старость->Смерть;
Юность->Смерть;
Зрелость->Смерть;
}
И сохраняем в виде текстового файла, например temp.dot. Далее в консоли пишем
$ dot -Tpng temp.dot -o temp.png
То есть перегоняем наш граф в формат PNG, чтобы можно было просмотреть его, скажем, с помощью gqview или любым другим просмотрщиком изображений. И вот что мы увидим:
Начальную идею это должно передать, а за подробностями милости просим в это совершенно исключительное по художественной силе описание
GraphViz. А я тем временем поделюсь своими заметками.

Небольшой пример
В этом примере я сгруппировал наиболее часто мной используемые находки в GraphViz, такие как уровни в графе, размер текста и форму элементов. Дабы минимизировать проблемы с кириллицей, стоит сохранять данные в кодировке UTF8.

Предварительные обозначения
Сначала эти уровни обозначаем (в данном случае это от 50.000 до 10.000 - читавшие GTD меня поймут, не читавшие могут узнать об этом больше).
{ //Уровни в проектах
node[shape=plaintext]; // чтобы было не видно рамок
edge[color=white]; // чтобы было не видно рамок
50.000->40.000->30.000->20.000->10.000->5.000;
}
Последовательность символов -> означает связь двух объектов, shape - форму объекта (рамка вокруг текста), color - соответственно цвет (здесь белый - чтобы не было видно рамки вокруг текста).

После этого группируем данные и даём понять GraphViz, что группа принадлежит к этому уровню:
{ // <============= Задачи на уровне 10.000 ==============
node[shape=rectangle,fontsize=10]; // порядок важен: описание свойств узлов должно идти раньше, чем сами узлы
rank=same; 10.000; "Диссертация";
"Проект РНП";
"Time-Frequency";
}
Здесь задаём размер текста fontsize поменьше (из эстетических соображений) и говорим GraphViz, что эти куски текста должны быть на высоте 10.000 (определённый уровень).

Теперь выстраиваем взаимосвязи объектов друг с другом:
"Time-Frequency"-> "Научные\nпроекты";
"Диссертация"-> "Научные\nпроекты";
"Проект РНП"-> "Научные\nпроекты";

"Диссертация"->"Time-Frequency"[dir=both]; // зависимость направлена в обе стороны
"Диссертация"->"Проект РНП"[dir=both]; // зависимость направлена в обе стороны
Тут две тонкости:
  1. чтобы текст в рамке разбить на несколько строк, ставим \n
  2. если нужно, чтобы стрелка была направлена в обе стороны - взаимная зависимость двух объектов - нужно рядом с зависимостью приписать [dir=both];
После этого можно собирать проект и перегонять его в любой удобный формат: PNG удобнее всего смотреть в просмотрщике, пока выстраивается структура, а потом перегнать это всё в SVG для печати или встраивания куда-нибудь.


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

digraph WorkAnalysis{
rankdir=TB; //как делается граф - сверху вниз.

{ //Уровни в проектах
node[shape=plaintext]; // чтобы было не видно рамок
edge[color=white]; // чтобы было не видно рамок

50.000->40.000->30.000->20.000->10.000;
}

{ // <============= Задачи на уровне 40.000 ============== node[shape=pentagon,fontsize=30]; rank=same; 40.000; "Исследования\nсигналов"; } { // <============= Задачи на уровне 20.000: Сфера ответственности node[shape=egg,fontsize=20]; rank=same; 20.000; "Научные\nпроекты"; } { // <============= Задачи на уровне 10.000 ============== node[shape=rectangle,fontsize=10]; rank=same; 10.000; "Диссертация"; "Проект РНП"; "Time-Frequency"; } "Time-Frequency"-> "Научные\nпроекты";

"Диссертация"-> "Научные\nпроекты";

"Проект РНП"-> "Научные\nпроекты";

"Диссертация"->"Time-Frequency"[dir=both]; // зависимость направлена в обе стороны

"Диссертация"->"Проект РНП"[dir=both]; // зависимость направлена в обе стороны
}
Вставляем его в файл a.dot и набираем:
dot -Tpng a.dot -o a.png
Видим что-то вроде этого:

Собственно, этот пример я состряпал на основе своего графа проектов, и этот код - только часть. Приведённый пример должен проиллюстрировать основные моменты работы с
GraphViz, которые я часто забываю :-)
Читать далее

QtOctave - графическая оболочка для Octave



13 коммент.
Хотя MATLAB и правит миром численных математических расчётов, в этом деле ему зреет очень хорошая альтернатива - GNU/Octave. И хотя у Октавы много проблем, таких как слабая документация и в основном консольный режим работы, есть и хорошие новости: проект QtOctave, ставящий своей целью сделать графическую среду разработки для Octave, весьма неплох. О нём и будет этот небольшой пост.

Установка
Для того, чтобы поставить QtOctave, вам потребуется скачать бинарник с сайта авторов и установить пакет octave в вашем дистрибутиве. Собранный и готовый бинарник прямо с сайта qtoctave_binaries_Linux_i386-0.8.1_svn166.binaries.tar.bz2 . Далее устанавливаем QtOctave по инструкции, то есть делаем sudo ./install.sh

В свежих версиях дистрибутивов QtOctave наличествует в репозиториях, и установить её можно просто и легко:
aptitude install qtoctave
По зависимостям потянется и новая версия GNU/Octave, если она ещё не установлена.


Работа
Собственно, открываем графическую консольку и пишем:
qtoctave
Перед вами развернётся графическая благодать, в которой замигает разноцветными огнями вся неимоверная мощь Octave. Разворачиваем одно из окон и открываем там свой скрипт на MATLAB\Octave. Выглядит это так:

По умолчанию можно просматривать переменные, список последних команд и файлов. В общем-то, для работы особенно больше ничего и не нужно. Развернув окно внутренней консоли в QtOctave, можно работать непосредственно с командной строкой Октавы и при этом видеть список активных переменных.


Сразу из замеченных недостатков: в графической консоли внутри QtOctave нельзя использовать подсказку по клавише TAB, при этом оно переходит в режим правки. Так же хотелось бы попенять на то, что QtOctave
не сохраняет расположение окон. Но это в общем не так бросается в глаза: при некотором навыке работы с Октавой или Матлабом работать вы будете не с консолью, а с редактором, как уже описывалось ранее.

Так же в комплекте идёт справка в формате HTML, причём весьма добротная. Конечно, до матлабовской ещё очень и очень далеко, но уже что-то. И главное, что это в комплекте, то есть batteries included.
То есть можно не только работать в Octave, но ещё и получать справку по командам, хотя и весьма базовую.


Заключение

В целом впечатление QtOctave производит очень благоприятное. Хотя Octave можно пользоваться таким же способом, как и MATLAB, о чём уже писалось, просмотр переменных и история команд в графическом виде это очень полезные возможности QtOctave. Хочется пожелать успехов проекту и дальнейшего развития.

Так же можно посмотреть в сторону
Python и SciPy. Как советуют товарищи питонисты, для этого есть следующие инструменты:
  • Python(x,y) готовый дистрибутив питона для научных нужд (batteries included).
  • SPYDER (графическая оболочка, входит также в Python(x,y) в дополнение к Eclipse)
Так же можно посмотреть в сторону IPython.

К сожалению, главный (и единственный!) разработчик QtOctave прекратил работу над проектом. Вот чем стоило бы заняться, КДЕшники, а не пилить свистульки типа фильтров Ланцоша и прочей мишуры...
Читать далее

Научная поисковая система на вашем Linux-десктопе



10 коммент.
Некоторое время назад я писал о SWISH++, и вот теперь мне хотелось бы обобщить написанное в более краткой форме. Проблема поиска нужной статьи, если не помнишь точно где она находится в каталогах, действительно серьёзная.


1. Поиск дубликатов
Итак, когда я накачал нужных мне статей из Интернета, я прежде всего смотрю, есть ли они у меня в коллекции с помощью fdupes. Эта программа ищет дубликаты файлов:
$ fdupes -rd .
Точка в конце говорит о том, что искать дубликаты fdupes будет, начиная с текущего каталога, поэтому можно в каталоге со статьями сделать подкаталог 1/ и набросать туда скачанные статьи.

Fdupes сравнивает файлы как побайтово, так и с помощью подсчёта md5-суммы, работает невероятно быстро, сортировка производится в полуавтоматическом режиме: программа выводит в консоли дублирующиеся файлы и спрашивает, какой из них оставить. Об этом уже говорилось в статье о подходах к сортировке PDF-файлов.


2. Индексация текста в PDF-файлах
Сначала из
документов pdf вытаскиваем текст, для чего просим утилиту find найти все файлы PDF и для каждого найденного выполнить pdftotext без выдачи предупреждений и без вставки символов разрыва страницы:
find -name '*.pdf' -exec pdftotext -nopgbrk -q {} \;
Надо отметить, что pdftotext хорошо работает только для английского языка, на котором, в общем, все статьи и написаны.

Теперь индексируем все текстовые файлы - в этом нам поможет собрат SWISH++ по имени index++ для индексации текстовых файлов:
index++ -e "text:*.txt" .
Точка в конце означает, что поиск ведётся с текущего каталога. Подробнее об индексации и автоматизации этого процесса сказано здесь.

В результате в текущем каталоге появится файл swish++.index где, собственно, лежит информация об индексировани файлов. Теперь всё готово для поиска.


3. Ищем в архиве статей нужное
Для поиска используем search++ которая найдёт по нашему запросу в индексированной базе swish++.index файлы. Вот пример поиска статьи по математической морфологии, в которых нет упоминания про медицину:
$ search++ morphology and erosion and dilation not medicine
Мгновение спустя вижу результат (вывод сокращён):
# results: 125
99 ./Krylov2.txt 3771 Krylov2.txt
49 ./13300407.txt 3103 13300407.txt
46 ./morph1.slides.printing.6.txt 4369 morph1.slides.printing.6.txt
37 ./lecture_morphology_sara.txt 6746 lecture_morphology_sara.txt
30 ./SIGGRAPH2002_Sketch-Mitchell.txt 5308 SIGGRAPH2002_Sketch-Mitchell.txt
26 ./MorphologicalImageProcessing.txt 7642 MorphologicalImageProcessing.txt
25 ./phdsymp2002_ledda.txt 8298 phdsymp2002_ledda.txt
23 ./lab2_manual.txt 9313 lab2_manual.txt
23 ./Project 1.txt 9946 Project 1.txt
22 ./morphology.txt 11212 morphology.txt
22 ./edg/morphology.txt 11212 morphology.txt
22 ./slides-6-geometry.txt 11717 slides-6-geometry.txt
22 ./V1BFOGG8.txt 10797 V1BFOGG8.txt
18 ./71650638.txt 13978 71650638.txt
Первая колонка - релевантность, вторая - расположение файла относительно текущей директории, третья - размер файла, четвёртая - имя. Просто и понятно.

Теперь в консольке набираю kdpf
./Krylov2.pdf и смотрю нужную мне статью. И всё.

Ссылки
Собственно, документации о SWISH++ очень мало, так что в основном я решил собрать свои предыдущие записи в один пост:
- поиск и удаление дубликатов файлов с помощью fdupes;
- выделение текста из PDF-файлов и их индексация;
- поиск в индексированных файлах с помощью SWISH++
Читать далее

MATLAB в Linux: вариант способа работы



30 коммент.
В этой заметке я, по просьбе некоторых трудящихся, опишу свой скромный опыт работы в MATLAB - системе численных математических расчётов, которая может почти всё. Последние версии MATLAB уже интегрируются зачем-то с Adobe Photoshop, Web и появляются тулбоксы по моделированию процесса заварки кофе. Следующая версия, ещё более пухлая, чем предыдущая, с большим количеством рюшечек, бубенчиков и свистелок, думаю, уже будет уметь варить капучино. В этом есть свои отрицательные стороны, о которых можно долго разглагольствовать, выдавая за преимущества. До тех пор, пока любимая ваша программа, работавшая со времён мезозоя, не вывалится в новой версии в любимое теперь MATLAB сообщение out of memory.

\begin{lyrics}
Заготовьте ваши тухлые помидоры...
... ибо автор этих строк сейчас как обычно рубанёт с плеча: MATLAB, друзья, правит балом. Эта нехитрая мысль навеяна, кроме прочего, здоровенным постером на последней странице журнала Physics Today. MATLAB стал языком инженеров и учёных благодаря своей замечательной, просто потрясающе продуманной и отлично написанной документации, простой и понятной интегрированной среде разработки и огромному количеству хорошо сделанных тулбоксов на все случаи жизни.

Под свист пролетающих над авторскими сединами помидоров и прочих несвежих корнеплодов, а также выкриков "Octave наше всё", хочу от всего сердца отметить: да, я знаю про Octave. Octave почти совместима с MATLAB. Octave быстрее, чем MATLAB, хотя и не намного. Octave свободна и не просит много мегабаксов. Но есть много но. Мало документации и она любительская: неоднородна по качеству и сильно уступает MATLAB-овской. Нет графической среды разработки (QtOctave в состоянии бета-версии, и ей ещё расти и расти). Почти совместимость с MATLAB я прочувствовал лично на себе: даже после установки octave-forge, о чём ещё нужно было догадаться, только три маленькие программки из моих почти полусотен матлабовских скриптов заработали без переделки. Остальные потребовали m-файлов из MATLAB и возюкания напильником. Все наши лаборатории в МИФИ, доколь хватает глаз, на MATLAB и я должен взаимодействовать с ними в плане обмена результатами. Так что увы. Это я о том, что если кто-то сумел приспособить Octave для своих задач - я очень за него рад, но в наших конкретных палестинах Octave не конкурент в данный момент из-за недостаточной совместимости с MATLAB.

Но это не вся беда. А беда в том, что в MathWorks, похоже, идеи закончились, и хорошие программисты стали потихоньку уходить. Закономерно стала ощутимо увеличиваться тяжеловесность графической оболочки MATLAB, в особенности всякими Java-прибабахами, столь милыми сердцу индийским программистам. Чем дальше версия, тем больше системные требования при одинаковом функционале. Как сказал один мой хороший знакомый, большой поклонник Windows Vista (она у него не тормозит и работает быстрее XP), "просто добавь памяти до 8Гб и купи себе, наконец, Core2Quad, как я". Меня, как и многих, такой подход, скажем так, не устраивает.
\end{lyrics}

Итак, есть желание работать в MATLAB с некоторым комфортом, таким как подсветка синтаксиса и возможностью переключаться между несколькими функциями, но с малым расходом ресурсов. Есть следующий рецепт:
  1. Устанавливаем в Linux / FreeBSD любой текстовый редактор с табами, подсветкой синтаксиса и выходом на консоль. Я для этого использую kate (подставьте сюда и далее ваш любимый текстовый редактор).
  2. В kate есть выход на консоль (Terminal), где мы запускаем MATLAB без графической оболочки командой: matlab -nojvm
    1. полезно поставить вызов консоли в kate на горячую клавишу (например, Alt+T) - так можно быстро отркрыть консольку и узнать, где в очередной раз вы напортачили в коде.
  3. В терминале kate запустится MATLAB и порадует вас простым командным интерфейсом.
  4. Теперь в kate открываем свои программы, написанные в MATLAB - при этом должна сработать автоматическая раскраска кода.
  5. Для запуска вашей программы переключаемся в консольку в kate и набираем её имя - автодополнение, как и всюду в UNIX, работает по кнопке TAB.
  6. Всё, программа начнёт работать и выдавать вам результаты.
Выглядит это всё так:



Аскетично, согласен, но когда вы уже хорошо знаете MATLAB и ваши программы написаны без использования ужасных MATLAB GUI, через некоторое время вы скорее всего будете ориентироваться в новой среде так же, как и прежде.


А теперь сравним
Для сравнения: на моей машине P4-3GHz и 2Gb RAM работает программа, выполняющая деконволюцию изображений размером 5Мпикс (три массива по 5Мпикс, два прямых Фурье-преобразования и одно обратное, деление массивов друг на друга). Так вот, мой MATLAB R14 аж 2004 года выделки такое изображение обрабатывает легко. Я могу в таком режиме matlab -nojvm запустить параллельно обработку ТРЁХ таких изображений, сидеть слушать музыку и писать другой текст.

В лаборатории: Core2Duo 2.6GHz, 2Gb RAM, Windows XP, MATLAB 2007b сходу вываливается на той же самой задаче в out of memory.


Выше небольшой скриншот, на котором показана работа двух MATLAB предыдущей версии параллельно в режиме nojvm, на фоне других работающих программ.

А для Windows...
Благодаря отзывчивости комментаторов, есть такие варианты использования MATLAB в Windows в экономичном режиме:
Это всё денег не просит, так что скачайте и попробуйте.


Заключение
После того, как руководство лаборатории обновило MATLAB на всех машинах на 2007b и они стали вываливаться в out of memory, я для себя сделал такие выводы:
  • Новые версии - не всегда лучшие, особенно если программа долго разрабатывается и тем более она проприетарная.
  • Работать можно и без графической оболочки, и почти так же комфортно (в вашем любимом текстовом редакторе).
  • Не сломалось - не чини (т.е. нет нужды в новых функциях - не обновляй программу).
А ежели уважаемые комментаторы накидают в комментарии примеров других текстовых редакторов, у которых есть подсветка синтаксиса и выход на консоль - буду очень им признателен. Особливо ежели текстовый редактор работает под Windows.
Читать далее

Шумоподавление на чипе современных CMOS-фотосенсоров



11 коммент.
По материалам кандидатской диссертации

У многих из нас есть цифровые фотокамеры - с их помощью можно сделать очень хороший снимок, даже если это камера мобильного телефона. Изображение современных камер отличается детализованностью и низким уровнем шумов. Как же им это удаётся?

Большинство современных цифровых фотокамер оснащены CMOS-сенсорами. Как известно, одним из главных недостатков CMOS-сенсоров является их высокий уровень шума. Тем не менее, современные CMOS-фотосенсоры, произведённые по 4/5Т-технологии, позволяют получать изображения с уровнем шумов, сравнимым с уровнем шумов CCD-фотосенсоров. Это достигается шумоподавлением на самом фотосенсоре и CMOS-пикселе. Данное обстоятельство следует учитывать при проведении измерений и регистрации сигналов на CMOS-фотоприёмники, а так же при оценке характеристик CMOS-сенсоров. 

Широкое применение CMOS-сенсоров связано с их весьма важным достоинством: при увеличении размеров фотосенсора энергетические затраты на передачу данных об изображении практически не увеличиваются. Если количество считывающих каналов в CMOS-сенсорах остаётся неизменным, то энергопотребление сенсора остаётся одинаковым и не возрастает при увеличении размера сенсора (см.Рис. 1). С другой стороны, CCD-сенсоры перемещают зарядовые пакеты, и это существенно более энергозатратно. Убыстрение процесса считывания в CCD-сенсорах так же приводит к дополнительному расходу энергии, что нежелательно в портативной технике. Даже по сравнению с малыми сенсорами, CCD-сенсоры потребляют вдвое больше энергии, чем CMOS, что видно на Рис.1. Сравнение полноформатных, 35-мм сенсоров показывает, что CCD-сенсоры потребляют почти втрое больше энергии, чем CMOS.

Рис.1: Сравнение энергопотребления современных CMOS и CCD-фотосенсоров.
Однако при проведении оценки характеристик CMOS-сенсоров следует учитывать то обстоятельство, что получаемые изображения для оценки темновых и световых шумов в значительной степени предобработаны электроникой камеры ещё до записи в RAW-файл или передачи в компьютер для последующей обработки. Ниже следует краткое описание методов шумоподавления на CMOS-фотосенсорах
Для того, чтобы устранить высокий уровень шумов CMOS-сенсоров, требуется создавать фотосенсоры с большим количеством транзисторов. Именно это позволяет производить шумоподавление внутри каждого пикселя, что приводит к существенному снижению уровня шума. Это потребовало создания сложных технологий 4/5Т производства CMOS-фотосенсоров.

Подавление темновых шумов

Называемый так же FPN, Fixed Pattern Noise, этот шум представляет собой разное смещение уровня сигнала для разных пикселей фотосенсора. В CMOS-сенсорах, помимо FPN, имеется так же неоднородность сигнала по столбцам. Основным методом устранения такого шума является метод CDS, Correlated Double Sampling. Процесс шумоподавления по методу CDS проиллюстрирован на Рис.2.


Рис.2: Метод CDS для подавления фиксированного шума на изображениях, зарегистрированных фотосенсорами CMOS.
В методе CDS производится одновременное считывание светового сигнала и темнового двумя независимыми считывателями. Темновой сигнал накапливается в пикселях фотосенсора, которые защищены от света. Сначала считывается только информация о темновом шуме, потом считывается световой сигнал вместе с темновым шумом. Далее из считанного сигнала вычитается темновой шум. После этого на изображении, зарегистрированным CMOS-фотоприёмником, фиксированный шум FPN компенсирован (см.Рис.3). Для этого использование технологии 4/5T является критичным.

Рис.3: Процесс шумоподавления по методу CDS.
Однако большее искажение в регистрируемое изображение вносит шум, связанный с неоднородностью фоточувствительности. Это вытекает из того факта, что технологически невозможно изготовить миллионы одинаковых CMOS-пикселей с усилителями внутри.

Подавление шума, зависящего от светового сигнала

Так как каждый пиксель CMOS-сенсора содержит несколько транзисторов, управляющих передачей данных, технологически невозможно сделать их идентичными. Это приводит к неоднородности величины сигнала даже при регистрации плоского светового поля, что проиллюстрировано на Рис. 4

Рис.4: Сигнал, подверженный шуму, вызванному неоднородностью фоточувствительности.
Изображения, полученные с ранних образцов CMOS-сенсоров, были подвержены шуму неоднородности фоточувствительности из-за того, что сброс темнового заряда на фотодиодах был неполным (см.Рис. 5)
Сначала производится сброс значения фотодиода, затем производится регистрация полезного сигнала (S). Следует заметить, что в процессе регистрации светового сигнала так же регистрируется и шум (S+N1). Далее считывался сигнал вместе с шумом (S+N1), фотодиод сбрасывался и считывалось значение шума (N2). Это приводило к тому, что на изображении оставался шум.

Рис.5: Неполный сброс значений фотодиодов приводит к считыванию сигнала с остаточным шумом.
Развитие технологии производства фотодиодов по 4/5Т-технологии сенсоров CMOS позволило более эффективно подавлять шумы, связанные с неоднородностью фоточувствительности. Так, был разработан метод полной передачи заряда. Каждый фотодиод содержит ячейку для запоминания темнового шума и ячейку для накопления светового сигнала (см.Рис. 6).

Рис.6: Метод полной передачи заряда для устранения шума, связанного с неоднородностью фоточувствительности.
Сначала считывается остаточный заряд, включающий в себя темновой и световой сигнал. Этот сигнал остаётся в ячейке фотодиоде, хранящей информацию об уровне шума, после чего производится сброс всех фотодиодов матрицы фотосенсора.
После завершения экспозиции, значение сигнала и значение шума считываются независимо - происходит замер текущего уровня шума.
Темновой заряд (N) и световой заряд (S) накапливается в разных ячейках одного и того же фотодиода. После того, как уровень шума (N) считывается, передаётся количество заряда из ячейки фотодиода, которая накапливала световой заряд. Происходит объединение уровней заряда (S+N) и считывание как целого. Так как уровень шума (N) известен для того же фотодиода, происходит их вычитание и, таким образом, считывается только информация о сигнале. Это и составляет основу метода полной передачи заряда
Кроме того, шум, вызванный неоднородностью фоточувствительности, возрастает с увеличением усиления ISO. Поэтому в ряде коммерческих цифровых фотокамер применяются технологии, которые усиливают сигнал в зависимости от уровня ``сигнал/шум'' на изображении. Сигналы с высоким соотношением ``сигнал/шум'' посылаются на усилители с большим коэффициентом усиления. Это позволяет CMOS-фотосенсорам выдавать изображения высокого качества в условиях съёмки, требующих высокого значения ISO и длинных экспозиций.

Ссылки
Пост подготовлен по материалам технической документации компании Canon на цифровые камеры Canon серии EOS и полноформатные фотосенсоры.
Читать далее

Установка и впечатления новой версии графического анализатора NIP2



7 коммент.
Не так давно вышла новая версия библиотеки обработки изображений VIPS, а вместе с ней и графическая оболочка nip2. Несколько слов о том, что изменилось и как новую версию быстро собрать и использовать.

Как уже говорилось тут, nip2 - это уникальный графический анализатор изображений любой разрядности и динамического диапазона. Новая версия nip2 за номером 7.14.1 стала ещё быстрее и появились новые возможности для анализа изображений.

Самые последние версии nip2 забираем отсюда из support-зоны, где самый свежак. Скачиваем vipsXXX.tar.gz и nip2XXX.tar.gz, при сборке последовательность такая же: сначала собираем VIPS и устанавливаем пакет, потом собираем nip2 и тоже устанавливаем. Последние версии (vips7.18.XX) могут не собраться, если Python старой версии - для этого указываем при сборке ключ --without-python и собираем.

Сборка и установка
Так как nip2 только вышел и вообще не так распространён, как например Gimp, придётся собрать пакет самостоятельно. Это нетрудно, однако могут потребоваться зависимости для того, чтобы nip2 работал на полную мощность.

Сначала собираем VIPS, для чего распаковываем в каталог vips-7.14.1 скачанный архив, и от рута даём команду:
dh_make --createorig
Далее пишем
debuild
VIPS должен собраться без вопросов. Полученный пакет устанавливаем
dpkg -i vips_7.14.1-1_i386.deb
После этого собираем сам nip2. Очерёдность важна, так как при сборке nip2 потребуются файлы из VIPS, на которой графический анализатор и основан. Кроме того, на этапе сборке могут произойти ошибки - чаще всего из-за отсутствия необходимых пакетов:

checking for PKGFLAGS... configure: error: Package requirements (gthread-2.0 gtk+-2.0 >= 2.4.9 libxml-2.0 vips-7.14) were not met:
No package 'gtk+-2.0' found
No package 'vips-7.14' found
Собственно, ставим эти пакеты.
aptitude install libgtk2.0-0 libgtk2.0-common libgtk2.0-bin libgtk2.0-dev
Так же могут потребоваться следующие пакеты:
aptitude install fftw3 fftw3-dev libxml2 libxml2-dev libxml++2 gsl-bin libgsl0-dev libxml++1.0-dev libxml++1.0c2a libtiff4 libtiff4-dev flex
Последний пакет, flex, я поставил только тогда, когда сборка вываливалась с ошибкой на файле parce.c и я не мог понять из-за чего. Конечно, в файле README было сказано, что он нужен, но кто ж его читать-то будет!? :-)

Итак, сборка должна успешно завершиться и собранный пакет ставим dpkg. Конечно, автора можно упрекнуть за такую "наколеночную" сборку пакетов, однако надо быстренько получить новую версию нужной утилиты, а не кружавчики вышивать.


Изменения в Nip2
Расширился состав фильтров, теперь в официально включён шумоподавляющий фильтр GREYstoration, ряды можно именовать по своему усмотрению, расширены функции программирования. А главное - Nip2 стал ощутимо быстрее предыдущей версии, так что если вы им часто пользуетесь, то есть смысл обновиться.

Фильтры
В составе Nip2 теперь улучшенные фильтры морфологического анализа (пока только бинарная морфология), многие фильтры получили возможность точной настройки (custom kernels), а так же включён шумоподавляющий фильтр GREYstoration, основанный на анизотропной диффузии. GREYstoration интересен тем, что реализует подавление шума при помощи весьма изощрённого "сглаживания" изображения. В результате это важные детали не размываются, а шума становится намного меньше. Техника anisotropic diffusion известна довольно давно, однако реализация в Nip2 достаточно быстрая и нетребовательная к памяти, что важно при работе с большими изображениями.
Пример приведён на этом скриншоте:

Справа сверху - оригинальное изображение, справа снизу - с подавленными шумами. Очаровательная девушка на фотографии - Лена Содерберг, о которой я уже писал.


Именование рядов
Это полезная функция, если требуется анализировать много изображений. Тогда можно задать один workspace и просто заменять одно изображение - остальное пересчитается автоматически. Именованные ряды позволяют проще отличать конечные результаты анализа от промежуточных подсчётов.
Просто впишите в пустую клетку:

Mean=Math_stats_item.Mean_item.action A1
и вы получите именованную ячейку, содержимое которой есть среднее значение изображения в ячейке А1. Именовать по-русски пока нельзя, только на английском.


Горячие клавиши на элементы меню
Очень и очень полезная возможность! Открываем меню, доходим до нужной нам функции, подсвечиваем её и наживаем к примеру CTRL+M - и теперь на функцию повешена горячая кнопка. Теперь, чтобы посчитать среднее значение на изображении, просто выделяем изображение и нажимаем CTRL+M.


Заключение
В общем и целом, релиз удался: nip2 стал ещё быстрее и получил новые фильтры и методы анализа изображений.
Читать далее

Построение графиков в gnuplot: двухмерные графики



9 коммент.
Построение графиков в gnuplot достаточно просто и очень эффективно, особенно когда их нужно строить много. Ниже на примерах будет показано, как строить двухмерные графики.

Как построить несколько функций на одном графике?
Есть два варианта: использовать функцию multiplot или внешними редакторами шаманить с EPS-файлами. Ниже будет описан первый вариант как более простой.

При построении нескольких графиков нужно включить режим multi-plot, после чего будет возможно размещать несколько функций или графиков данных в одном окне. Например, построим три функции: y=x, y=x*x и y=x*x*x. Что для этого дополнительно нужно задать в интерактивном режиме:

gnuplot> set multiplot
multiplot> plot x
multiplot> plot x*x
multiplot> plot x*x*x
multiplot> set nomultiplot
Вот что при этом может произойти:



Такое случается потому, что гнуплот определяет границы для каждого графика автоматически, что может привести к нежелательному результату. Следует задавать границы принудительно:
gnuplot> set xrange [-10:10]
gnuplot> set yrange [-10:10]





Как построить график внутри графика?
Рассмотрим это на рабочем примере. Есть файл с данными, точек много, и интерес представляет участок на кривой. Данных много, и естественно это скормить перловому скрипту, который нашинкует графики с подстановкой имён. Вот код графика:
#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "~/matlab/programs/kmvdecoder/plots/2conventionalRAWMAXtoSaturatecomparing.ps"
set encoding koi8r
set xlabel "Exposure time, sec." font "Helvetica,18"
set xrange [1:60]
set key top right
set ylabel "Pixels maximum value" font "Helvetica,18"
Это не должно вызывать вопросов - подобное разбиралось тут. Дальше:
set multiplot
set origin 0.0,0.0
set size 1.0,1.0
Устанавливаем стиль линий, которыми будем строить графики
set style line 1 lt 1 pt 9
set style line 2 lt 3 pt 7
set style line 3 lt 2 pt 5
Теперь, собственно, строим основной график.
plot "~/matlab/programs/kmvdecoder/plots/RAWMAXmeasurementresult"
using
3 notitle with linespoints linestyle 2,
"~/matlab/programs/kmvdecoder/plots/RAWMAXmeasurementresult" using 3 n
Пути и имена файлов, естественно, нужно поменять, так как я даю всё на примере собственных файлов. Напоминаю, что для ленивых людей, помимо гнуплота, есть ещё и Perl, скрипты которого резво подставят всё нужное в имя файла: и вы поймёте, и цикл перебора организовать проще. Основной график построен - загружаем его в программу просмотра PostScript-файлов и смотрим, где значения, которые нужно строить внутри маленького графика.
set origin 0.55,0.1
set size 0.4,0.4
Первый параметр задаёт положение левой верхней границы маленького графика в относительных единицах длины. Второй - размер графика. Так как подписи к осям на вложенном графике будут только мешать - отключаем их:
set noxlabel 
set noylabel
С видом графика определились, теперь определяемся с осями:
set xrange [ 30 : 38]
set yrange [ 3300 : 3800 ]
Всё, теперь осталось приказать гнуплоту перестроить график (чтобы появился вложенный):
replot
set nomultiplot
Готово - качественный график быстро и легко построен. Вот как он выглядит:



Как построить простую гистограмму?
Если вы создаёте графики в формате PostScript, самый простой способ заключается в том, чтобы нарисовать это при помощи with impluses с очень тонкими линиями. Например, так:
gnuplot> set term postscript eps enhanced color
gnuplot> set style line 1 lt 1 lw 50
gnuplot> plot "test.dat" using 1:2 with imp ls 1
Вот что при этом получится:


Так же можно заполнять столбики гистограмм цветом или вариантами текстурной заливки при помощи команд
with boxes fs [pattern | solid] номерстилязаливки. Так же можно задавать независимо стиль при помощи команды set style fill.

В случае с with boxes fs pattern, параметр pattern используется для определения заполняющей текстуры. Параметр solid определяет плотность заполнения столбца гистограммы, значени от 0 до 1.

Вот пример гистрограммы, построенной с различной заливкой:
gnuplot> plot "test.dat" usi 1:2:(3) w boxes fs pattern 1,\
gnuplot> "test.dat" usi ($1+5):2:(3) w boxes fs solid 0.7






Как на одном графике построить данные в логарифмическом и обычном масштабе?
Например, есть такой график:


По оси Х в диапазоне [0:30], но вблизи нуля по оси Х данные очень важны и нужно показать их детально. Можно сделать два разных графика, но можно провернуть тоже и на одном.
Сначала построим график до единицы в логарифмическом масштабе:
gnuplot> set log xy
gnuplot> set xrange [ 0.001 : 1 ]
gnuplot> set yrange [ 0.1 : 5000 ]
gnuplot> set xlabel "Energy [eV]"
Для данных в диапазоне [1:30] используем линейные оси, и поместим второй график за первым, используя возможности multiplot. Таким образом, логарифмическая часть графика будет слева, а линейная - справа. Каждый подграфик займёт половину размера картинки. Вот как это выглядит в коде:
gnuplot> set multiplot
multiplot> set size 0.5,1
multiplot> set origin 0.0,0.0
multiplot> set lmargin 10
multiplot> set rmargin 0
multiplot> plot "calc.dat" u 1:2 w l
multiplot> set origin 0.5,0.0
multiplot> set format y ""
multiplot> set lmargin 0
multiplot> set rmargin 2
multiplot> set nolog x
multiplot> set xrange [1:30]
multiplot> set xtic 0,10
multiplot> set mxtic 5
multiplot> plot "calc.dat" u 1:2 w l
multiplot> set nomultiplot
gnuplot>
Результат смотрится очень эффектно:





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

Для того, чтобы вычислить соотношение данных одного ряда по отношению к другому, значения по оси Х должны быть одинаковы для обоих рядов. В примере ниже, первая колонка содержит значения Х, вторая колонка содержит значения по оси Y набора данных А, третья колонка содержит значения Y набора данных Б.

Сначала устанавливаем параметры оси Х, одинаковые для обоих наборов данных:
gnuplot> set xrange [ 0.01 : 30 ]
gnuplot> set nokey
gnuplot> set log x
gnuplot> set xtics 10
gnuplot> set mxtics 10
gnuplot> set lmargin 10
gnuplot> set rmargin 2
Теперь создаём нижнюю часть графика, которая показывает соотношение данных. Так как данные по оси Y находятся во втором и третьем столбце файла с данными, можно построить их соотношение так plot 1:($2/$3). Таким образом, вторая часть выглядит так:

gnuplot> set multiplot
multiplot> set yrange [ 0.5 : 1.5 ]
multiplot> set ytic 0.6,0.2,1.4
multiplot> set ylabel "Ratio"
multiplot> set size 1,0.4
multiplot> set xlabel "Energy [eV]"
multiplot> set origin 0.0,0.0
multiplot> set bmargin 3
multiplot> set tmargin 0
multiplot> plot 1 w l 0,"cross.dat" u 1:($2/$3) w l 1
Осталось доделать верхнюю часть, чем сейчас и займёмся. Сделаем размер графика поменьше и отобразим в логарифмических осях. Наименования по оси Х стираем, и вот что получилось:
multiplot> set log xy
multiplot> set yrange [ 0.1 : 5000 ]
multiplot> set ytic 0.1,10
multiplot> set ylabel "Cross Section [b]"
multiplot> set size 1,0.6
multiplot> set origin 0.0,0.4
multiplot> set bmargin 0
multiplot> set tmargin 1
multiplot> set format x ""
multiplot> set xlabel ""
multiplot> plot "cross.dat" u 1:2 w l,"" u 1:3 w l
multiplot> set nomultiplot
gnuplot>
Результат:

Читать далее

Создание графиков в gnuplot: оформление двухмерных графиков



13 коммент.
В этом посте освещается ряд вопросов об оформлении графиков: управление осями, изменение полей и шрифтов графиков, изменение сетки и прочее.
Читать далее

Создание графиков в gnuplot: деления на осях



13 коммент.
Gnuplot автоматически подгоняет деления на осях под данные, однако в сложных графиках их нужно переопределить - о чём говорится ниже.


Как изменить деления для каждой из осей?
Есть два вида делений на осях: основные и дополнительные. Обычно на осях отрисовываются только основные деления, и по умолчанию дополнительные отбражаются только при логарифмическом масштабе. Для переопределения делений на осях используется команда set {x|y}tics например, так:
gnuplot> set xtics 2
gnuplot> set ytics 0,200
gnuplot> plot x**3




Это приведёт к тому, что приращение по оси Х будет равняться 2, так что деления становятся вида -10, -8, ... +10. Для оси Y задано начальное значение (0) и приращение (200), так что GNUplot создаёт деления в точках 0, 200, 400...

Так же можно указать конечное значение, например так:
gnuplot> set ytics 0,200,600.
Дополнительные деления задаются параметром set m{x|y}tics. Интервалы между основными засечками делений делятся на это значение:
gnuplot> set mxtics 2
gnuplot> set mytics 2




Так же возможно поместить собственный текст в деления осей вместо чисел. Например, написать "April", "May", "June", и "July" в позициях X=1,2,3 и 4, что возможно осуществить следующей командой:
gnuplot> set xtics ("April" 1, "May" 2, "June" 3, "July" 4)
gnuplot> plot "test.dat" using 1:2:3 notitle with boxes,\
"test.dat" using 1:2 notitle with lines




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

Команда set ticscale n m изменяет масштаб чисел в деления. Главные деления умножаются на величину n, тогда как дополнительные умножаются на величину m. Если m опущено, дополнительные деления принимают значение половины от величины главной деления.

деления отрисовываются внутрь, а чтобы они отрисовывались наружу, следует указать:
gnuplot> set tics out


Как использовать степенные деления?
Для этого следует переопределить формат следующим образом::
gnuplot> set format x "10^{%g}"
Теперь по оси Х деления станут вида 10^0, 10^1... и так далее.




Как использовать экспоненциальные деления вместо десятичных в логарифмических осях?
Формат по умолчанию "%g", а в логарифмических осях метки записываются в формате "F", например 0.01, 1000, и так далее, если данные в пределах от 0.0001 до 100000. Числа, выходящие за этот диапазон, записываются в формате "E" и записываются как 1e-05, 1e+06, и т.д.

Чтобы сделать деления к осям в виде степени 10, измените формат на "10^{%L}":
gnuplot> set format y "10^{%L}"
Для корректного отображения надстрочных и подстрочных индексов следует использовать расширенный postscript-терминал, добавив в скрипт построения графиков:
gnuplot> set terminal postscript eps enhanced
Вот что получится:



Как убрать отображение чисел из деления?
Просто добавьте параметр:
gnuplot> set format x ""
деления по оси Х отображаться не будут.


Как отобразить промежуточные значения в логарифмическом масштабе?
Обычно логарифмические деления к осям отображаются степенями 10 (1,10,100...). Иногда для лучшего понимания данных, изображённых на графике, требуется поместить засечки на осях между главными подписями, особенно когда диапазон значений невелик. Вот как это можно сделать:
gnuplot> set logscale y
gnuplot> set yrange [1:50]
gnuplot> set ytics (1,2,5,10,20,50)
gnuplot> set format y "%2.0t{/Symbol \327}10^{%L}"
gnuplot> set lmargin 8
gnuplot> set terminal postscript eps enhanced
gnuplot> plot exp(x)/x
Тёмно-красным выделен небольшой хак, который позволяет выводить деления как "число умноженное на 10^n".

Результат на рисунке:


Этот Postscript-символ отображает умножение точкой. Чтобы изменить его на "крестик", используйте {/Symbol \264}. Описанный здесь хак работает не всегда и не на всех системах.


Как изменить формат чисел в деления осей (общий вопрос)?
Это более общее описание форматов деления к осям: за это отвечает команда set format. Синтаксис команды такой:
set format имяоси{x|y|z|xy|x2|y2} "формат строки"
Например, чтобы гнуплот показывал деления в как десять цифр и три после запятой, нужно дать команду:
gnuplot> set format x "%10.3f"
Синтаксис для цифро такой: "%" + (полная длина).(точность).

Формат отображения выражается одной буквой -- 'f', 'e', 'E', 'g', 'x', 'X', 'o', 't', 'l', 's', 'T', 'L', 'S', 'c' и 'P'. По умолчанию используется "%g". Следующая таблица показывает разницу между форматами 'f', 'e', 'x' и 'o'. Форматы 'e' и 'E' одинаковы всегда, кроме случая, когда текст написан в формате 'e' or 'E'. Формат "%O" присутствует в мануале к гнуплоту, но не работает (скорее всего, ошибка в программе)


Пример (подчёркивание означает пробел)
f десятичны %6.3f __6.00
e,E экспоненциальный %11.4e _5.0000e+01
x,X шестнадцатеричный %x fffffffb
o,O восьмеричный %o 37777766

Форматы 't', 'l', 'T' и 'L' относятся к логарифмическим графикам. Для примера построим график функции y=exp(-x)+exp(x) в диапазоне X значений [-10:10]. Во-первых, эта функция отображается в нелогарифмическом масштабе, так что отобразим данные сразу в трёх форматах:

gnuplot> set format y "%T %t %g"
gnuplot> plot exp(-x)+exp(x)



Можно задать другие форматы при одновременном отображении, как и в этом случае. В данном примере, "%t" отвечает за мантиссу по основанию 10 и "%T" отвечает за степень по основанию 10. Таким образом, число, выраженное в формате "%g", отображается как A x 10^B, где A задано в формате "%t" и B в формате "%T".

Теперь перестроим график:
gnuplot> set logscale y
gnuplot> replot



Читать далее