Сергиенко А.Б. Цифровая обработка сигналов (2002) (1095939), страница 102
Текст из файла (страница 102)
В результате мы чаще всего даже не задумываемся над тем, что в действительности происходит при выполнении простейшего (с точки зрения пользователя) оператора присваивания. Рассмотрим небольшой пример: 1ог К = 1:Ы Ж какие-нибудь вычисления БЗ7 Программирование 5000: 0.770 весомое 6000: 1.040 зесопоз 7000. 1.210 зесопез 8000: 1.430 зесопез 9000: 1.590 зесопоз 10000: 1.810 зесопез Как видите,по мере роста размера массивов скорость работы сильно падает— для добавления последней тысячи элементов понадобилось в 30 раз больше времегги, чем для первой1 Решением этой проблемы является предварительное выделение памяти под заполняемые в цикле массивы, Для этого необходимо создать переменную нужного размера, скажем, с помощью функции иегов, формирующий массив, заполненный нулями.
Модифицируем препыдущий пример; » с1еаг а11 Ж ллЯ чистоты эксперимента » х - аегоз(1. 1е4): Ж создаем массивы » у = тегоз(1, 1е4); Ж заранее » тгс » тог и = 1 1е4 » х('х) - гамом: » ут~) = гапоп; » т~ геа)1'и, 1е3)=-0 » с=тес; » тргтптт11. ' 10: $.3т зесопг)зтп', и. 1) » Отс » епО » епс 1000: 0.060 зесопоз 2000: 0.000 зесопоз 3000: 0.000 зесопоз 4000: 0.050 весомое 5000: 0.000 зесопез 6000: О.ООО зесопОз 7000: 0.060 зесопОз 8000. 0.000 зесопоа 9000: 0.000 зесопоз 10000: 0.050 зесопез Результат налицо: работа цикла проходит равномерно, не замедляясь.
ЗАМЕЧАНИЕ Функция тос измеряет время дискретными порциями, размер которых лежит между 50 и 60 мс. Этим и обьяспяются нулевые значения, несколько раз полученные при выполнении последнего примера. При использовании оператора и)г)1е чнсло проходов цикла заранее не известно. Поэтому не известен и итоговый размер наращиваемых в таком цикле массивов. В этой ситуации можно применить компромиссный подход, увеличивая массивы 538 Приложение А. Основы работы с МАТЦАВ внутри цикла, но не при каждом проходе, а изредка, зато большими кусками.
Получается код наподобие следующего; зтзе тпсг - 10000: Ж дискретность прирашениЯ х = зегоз( 1. зтзе тпсг): Ж создание пассивов у " зегоз(1, втзе тпсгз: х-1: Ж счетчик зпенентов ыП11е сопс Ж проверЯеи. не исчерпана ги текушаЯ длина пассивов тГ 'к>1епрти(хз Ж выдепЯен допопннтепьнуа памЯть х = (х зегоз(1.
зтзе зпсгП: у = (у зегоз( 1, з1ае 1псгП, епб Ж какие-нибудь вь.чисгениЯ х(кз = ... у(к) - ... 'к 'к+1: Ж увегнчиваен значение счетчика епб Ж после завершениЯ цикла удапЯен нулевые «хвосты» х(к:епоз - П; у(д;епоз = Г3, Данный подход позволяет существенно ускорить вычнслешви если число проходов цикла заранее пе известно. До сих пор мы измеряли время выполнения фрагмсцтов программы с помощью функций Ж1с и Жос. Они весьма полезны, но в (т(АТЕЛВ имеется и более серьезный хронометрирую(ций инструмент — утилита профилирования, вызываемая командой рготт1е оп В качестве примера создадим несколько вариантов функции 1пб 01 тт, вычисляющей квадратную матрицу, значения элементов которой равны разногтти пх индексов: Ад - т — у'.
Единствепным входным параметром является размер М создаваемой матрицы. Первая версия кода будет наиболсс прямолипсшнтй — с использованием двух вложенных циклов: гопсзтоп у = 1пб бтГГ(МЗ ГОГ к = 1:М гог! =1:М у(к.1) - х - 1: епб епб Сохраняем текст функции в виде файла (пс( сп(1лп, включаем профилирование и вызываем фу. "цию: » ргогтзе оп у тпб бзтГ(100): 539 Программирование Для вывода результатов 1трофили)зевания используется следуюгцая команда; » рга111е герагт МАТ| АВ сгсисрирует отчет в НТМВ-формате и покажет его в установленном в системс шсЬ-броузере (рис. А.В).
Рио. А.в. Итоговый отчет о профилировании В итоговом отчете показаны общее время профплироваиия, число вызванных функций и время, затраченное иа их выполисиие. В данном случае кроме самой функции рго111е вызывалась только наша фуикцця 1по' б1тт. Чтобы получить подробпую ищ1тормацшо о результатах профилирования этой функции, необходимо щслкиуть иа ее имени в таблице.
После перехода по гпперссылке откроется стращща детализированной ииформации (рис. А.9). Наибольатий интерес здесь представляют выведенные под таблицей отдельные строки листинга функции, рядом с которыми показано абсолютное (в секундах) и относительное (в процентах) время их выполнения. Проапализируем получспиые результаты. Нскоторос время потрачено па обслуживаиие циклов (строки 5 и 6), ио основные затраты (71%) пришлись иа оператор присваиваиия (строка 4). Воспользуемся данным ранее советом и заранее выделим память под создаваемый массив: 1апст1оп у - 1по' о1т1(11) у - гегоз(в, иН 540 Приложение А.
Основы работы с МАТСАВ Гог К - 1'.К тог1=1И у1~.11= ~ -1; епо епб Рио. А.в. Отчет о результатах профилирования — детальная информация о вызываемых функциях Сохраняем новую версию и снова включаем профилирование (команда рготт1е герогс выключает режим профилирования): » ргот11е оп » у = 1пб б1ГГ(эбб1: » ргоГ11е герогт 541 Программирование Сгенерированный детальный отчет показан на рис.
А.10. Кзк видите, время, затрачиваемое на выполнение присваивания внутри цикла, сушсствснно уменьшилось. Завершаем работу с утилитой профилирования: » ргот11е отт Рис. А.10. Результаты профилирования оптимизированного кода ЗАМЕЧАНИЕ Приведенные варианты кода были рассмотрены лишь с целью продемонстрировать профилирование. Время выполнения данной функции можно ешс сильнее уменьшить, отказавшись от циклов вовсе. Если вам действительно нужно создать такую матрицу, следует заметить, что вдоль сс диагоналей, параллельных главной, стоят одинаковые числа, и воспользоваться функцией тоер111ж у = тоер1~тг(0:Н-1.
-(О:Н-1)): Это, пожалуй, наиболее быстрый способ. Приложение А. Основы работы с МАТГАВ МАТЮКАВ и русский язык Поскольку разработчики системы МЛТ1.ЛВ пе предусматривали работы с кириллицей, при попытке испо.ъзования русского языка в МАТЮКАВ возникает ряд проблем. Конкретный наоор возможных неприятностей зависит от конкретных версий МАТ|АВ и операционной системы, поэтому перечислим здесь лишь несколько вещей, характерных для шестой версии МАТ1.АВ.
Во-первых, в комментариях и текстовых константах нельзя использовать строчную букву «я» (это вообще довольно тюшчная беда программ, написанных иа языке С). Именно по этой причине в комментариях к листингам в данной книге везде испольауется прописная буква «Я». Во-вторых, при наборе в командной строке строчной русской буквы «с» происходит переход на слелующую строку, причем уже набранная строка не выполняется и не запоминается, В-третьих, при попытке использовать русский текст в иалписях на графиках иногда возникают проблемы с кодировкой выбираемого МАТ1.АВ шрифта.
Впрочем, послсднюк~ проолему, как правило, удается решить, изменив настройки, используемые для вывода надписей по умолчанию. Графика Говоря о графических средствах МАТЮКАВ, прежде всего нужно отметить следующее, МАТ1А — матричная программа, и ее графические команды могут лишь разнообразными способами визуализировать векторы и матрицы. На практике это означает, что точки, соответствующие элементам векторов и матриц, могут соединяться лишь прямыми линиями — никакого сглаживания или интерполяции производиться не булет. Если вы хотите, чтобы график выглядел более плавным, позаботьтесь о том, чтобы в впзуализируемом массиве было больше точек. Если строится график функции, уменьшите шаг между соседними значениями ее аргумента.
Если необходимо сгладить экспериментально полученные данные, для которых получить дополнительные точки затруднительно, следует воспользоваться функциями интерполяции (1птегр*, зр)1пе, рсмр, ог1ббаса«) илн аппроксимации (ро)ут1С; кроме того, имеется графический интерфейс аппроксимации, вызываемый командой Ваз1с Яйлам из меню Тоо!з графических окон). За более подробными сведениями обратитесь к документации МАТЮКАВ. Двумерная графика Основным средством двумерной графики является функция р1от.
Наиболее типичный вариант ее использования выглядит следующим образом: р1от(х. у> Здесь х и у — векторы олинаковой длины, задающие соответствующие координаты точек, выводимых на график. По умолчанию точки соединяются сплошными линиями синего цвета. Тип и цвет линий и символов точек можно изменить, об этом будет рассказано далее, в разделе «Настройка внешнего вида графиков».
543 Графика В качестве примера построим график функции у - з1п(тат)хх(тат), которая в МАТ1.АВ имеет имя з1пс (рис. Л.11): » х - -10:0.1:10; Ж значен~Я координаты х » у - втпс(х): Ж значениЯ координаты у » р1ог(х, у) Рис. А.тт. График, построенный функцией р!от Если на экране еще не было графиков, функция р1ос создаст графическое окно. Если иа экране уже иГислись графические окна, график будет выведен в тлекущее окно — то, которос последним выводилось на передний план, О том, как можно создать несколько графических окоп, будет рассказано далее, в разделе «Одновременный вывод нескольких грвфиковм ЗАМЕЧАНИЕ Можно использовать функцию р1от с одним аргументом — 1йот(у). Б этом случае вектор у задаст всртнквльныс координаты точек, а но горизонтали отклвльн1аютси номера элементов вектора.
Панель управления графического окна В всрхней засти графического окна расположена панель инструментов (рис. Л.12), кнопки которой выполняют следуюшие функции: 01 Неву Рюцге — создает новое графическое окно; 00 Орел Ейе — позволяет создать новое графическое окно, загрузив в него ранее сохраненный график; 544 Приложение А. Основы работы с МАТ!АВ Заче Е!Ваге хтквп !и Орел Е!1е ~ Рлл! Е1доге хвост Оо! г«евг Юдоге йо!а!е 30 '~'.Ё ~Ф:я Ф'~,';,!у А'"«и."~'„",,)~::д':~ъ.:, ВО!! Р!о! ! ! !пвеП Ыпе !плен Тех1 !плен Апов Рис.