Сергиенко А.Б. Цифровая обработка сигналов (2002) (1095939), страница 101
Текст из файла (страница 101)
Полная информация о возможных специфнкаторах формата имеется в ПТМ(.-справке, здесь же приведем лишь несколько конкретных примеров: 533 Программирование (3 Ы вЂ” вывод целого числа, количество позиций выбирается автоматически; О 1. 31 — вывод числа в формате с фиксированной запятой, после запятой выводится три десятичных знака, количество позиций для целой части выбирается автоматически; О $-15.3е — вывод числа в экспоненциальном формате, мантисса имеет три десятичных знака после запятой, поле вывода занимает 15 символов, текст выравнивается по левому краю поля. Для вывода специальных символов можно использовать комбинации 1п (перевод строки), 1г (возврат каретки), 11 (табуляция), 1Ь (забой), О (обратная косая черта), 11 (снмвол процента), ' ' (однночцый апостроф).
Теперь используем перечисленные спецификаторы и некоторые из символов; » п = 15: » егг = 128.3567: » ча1ое = 1234567890; » 1рг1п11( 1, 'Шаг Шбй ошибка 1.31 'чпк''= Ж-15 Зе и', и, егг, ча1ое) Шаг 15, ошибка 128 357 х'= 1.235е+009 и Сохранение и загрузка значений переменных МАТ(.АВ позволяет сохранять переменные в виде МАТ-файлов (они имеют расширение зпа1), которые затем могут быть снова загружены. Для сохранения всего содержимого рабочей области пагияти используется команда » заче 111еоаше Все сушествуюшие в данный момент переменные будут записаны в расположенный в текущем каталоге файл 10епате.гпа1.
Чтобы сохранить значения только некоторых переменных, следует указать их имена после имени файла: » заче П 1епаше х у азб ... В файл 10епапзе.гоа1 будут записаны только значения переменных х, у, азб и т. д. Загрузка сохраненных переменных производится командой 1оаб; » 1оаб 111епаше Файл 10епагпелпа1 должен быть доступен, то есть он должен находиться в текуШем каталоге или в одном из каталогов, внесенных в список для поиска файлов (см. ранее раздел «Путь поискаэ). Работа с отладчиком Отладочные средства собраны в правой части панели инструментов окна редактора/отладчика (рис. А.7), а также в меню 07еьоп и Вгеакро1п1з.
Кнопки панели инструментов имеют следугощее назначение: О Яе1/с1еаг Ьгеакро|п1 — установка или сброс точки прерывания в текушей строке; Ю С!еаг ай ЬгеаКро~п1з — сброс всех точек прерывания; 534 приложение А. Основы работы с мдтгдв О 81ер — выполнение одной строки программы, при атом вызов функции считается одним оператором и заход внутрь вызываемой функции не производится; О 81ер ~и — выполнение одной строки программы с заходом внутрь вызываемых (!)упкций; О 81ер оц1 — вьшолненпе оставшейся части текущей функции, остановка про- граммы производится после возврата из фупкпии; Н Сопбпое — продолжение выполнения программы; О Екй Оебод Моне — завершение отладки; Е! 81ас!г — этот раскрывающийся список позволяет переклгочаться между рабочими пространствами МАТВАВ и вызванных функций.
С!еаг ар Ьгеахро!п!в Екп Оеьоя Мосе ЗетГс!еаг Ьгеахро!п! ! Сопбпое 3!асх Ю Ф 'НАГО!,1О!О! и.'"Ю1Ю" ! -"! 3!ер 3!ер оо! З!ер !п Рис. А.т. Отладочные средства панели инструментов окна редактора/отладчика При остановке программы в отлалочиом режиме (в установленной точке прерывания или при пошаговом вьшолнегшп) в главном окне появляется отладочная подсказка К».
Прп этом становятся доступ!пикш рабочие области памяти всех вызванных в данньш момент функций. По умолчанию текущей является рабочая область памяти последней вызванной функции. Переключаться между рабочими областями памяти всего стека функпий можно с помощью раскрываюгцегося списка 81ас!к панели отладочных инструментов (см. рис. А.7). Такой же список имеется в панели шштрументов вкладки УтогКэрасе !см.
рис. А.5). Область памяти среды МАТВАВ фигурирует в списке под именем Вазе. Кроме того, узнать значение переменной можно, задержав указатель мыши па ее идентификаторе в окне редактора/отладчика. Появится всплывагошая подсказка, отображагоц!ая значение переменной. Этот способ имеет смысл применять только для скалярных переменных п массивов небольшого размера, поскольку для болыпих массивов оп>бражается только часть содержимого либо только размер и тии данных.
Оптимизация МАТЮКАВ-программ Под оптимизацией в данном случае подразумевается повышение скорости работы функций и программ. В МАТВАВ применимы все или почти все общие приемы оптимизации программ !типа вынесения из цикла наружу всех вычислений, пе завися!пих от счетчика цикла). Однако у МАТ1 АВ имеется и некоторая специфика, которую следует учитывать при оптимизации кода. Об этой специфике и пойдет речь в данном разделе. 535 Программирование При необходимости повысить быстродействие МАТВАВ-ирограммы следует учи- тывать два аспекта: 00 МАТ1.А — ихтерпретируюалая, а не комишшрующая система; (3 функции векторно-матричиых операций встроены в ядро системы и выполняются предельно быстро.
Самая обдцая рскомснлация, которая дается практически в любой книге, посвященной МАТ!.АВ, — стараться избегать использования циклов, заменяя их векторно-матричными операциями и поэлементньмш онерациямн над массивами. Приведем простейший пример, вычислив 10000 значений функции в!и двумя способами — с полющью цикла и путем выполнения иоэлементной операции над вектором. Хронометраж будем вести с помощью функций Сдс и сос. Первая из них фиксирует начало отсчета времсшц а вторая выволиз иа экран время (в секундах), прошедшее после Сдс. Вот соответствующий программный код: » Ж вичиспекиЯ в цикле » Ж дпЯ чистоты зксперимектв уничтожаем. все перемеккие » с1евг а11 » с!с » тог и = 1;10000, х(К) = взп!к П епс » гос е1врвеб С!ве = 3.7900 » Ж векторнаЯ опервцлЯ » х дпЯ чистоты зксперимекта уничтожаем все переменные » с1еаг а11 ' > с!с » х = з!п(1;10000).
» еос е1врвеб тлве = 0.0500 Как видите, отказ от использовашщ цикла ускорил вы шслсиия примерно в 75 раз! ЗАМЕЧАНИЕ Время выполнения фрагмента программы ыожст зависеть от того. существуют используемые иерсмсииыс или их и!щходпз си гож)акать (сы, лалсс оосужлснис во~ ~рогов, связанных с выделением памяти). Поэтому для иовьииения чистоты эксперимента в приведенном листипгс перед началом расчетов все имеющиеся псрсыспныс уничтожаются командой с1саг ай.
Эту команду ыожпо также паюльзовать лля выборочного уничтожения переменных — в этом случае вместо слова а!1 необходимо указать имена стираемых переменных, разделяя их пробелами: г!саг х у х.,.. Однако ие следует воспринимать даиньш совет как аосолютную догму. Не все алгоритмы хорошо поддаются векторизации, и иногда попытка искусственно свести алгоритм к последовательности матричных операций может потребовать создания промежуточных матриц большого размера. Необходимость выделения 536 Приложение А.
Основы работы с МАТЬАВ ксК) = епс Если переменная к не.сутцествовала до начала цикла, то при каждом проходе цикла происходит увеличение числа элементов в ней. В результате при каждом выполнении оператора присваивания система должна проделать следующее: ОЗ выделить память под переменную х нового размера; ОЗ скопировать туда старое содержимое переменной; О) освободить память, отведенную ранее под хранение старого значения к; ьЗ наконец, выполнить собственно оператор присваивания для х('к).
Операции выделения и освобождения памяти выполняются довольно медленно, поэтому необходимость проделывать их при каждом проходе цикла может сильно замедлить работу программы, особенно если наращиваемые массивы имеют большой размер и если в цикле их используется несколько. В качестве примера будем в цикле заполнять два вектора случайными гауссовыми числами, выводя на экран время, потребовавшееся для добавления каждых 1000 элементов: Ж длЯ чистоты вксперикента » с1еаг а11 » т1с » ~ог К - 1:1е4 » х(К) = гапон; » у1К) = гапбп: » т~ гея1'к.
1еЗ)==0 » с=тес: » ~рг)пст11. 'ко: я'.Зт веселов)п', 'к, с) » ь1с » епс » епб 1000: 0.0бО веселов 2000: 0.270 веселов ЗООО: 0.330 веселов 4000: 0,500 веселов памяти для хранения этих матриц может свести на нет преимущества отказа от циклов. Итак, без циклов все-таки обойтись не удается, но при необходимости их использования следует обратить внимание еще на один аспект — выделение памяти для хранения переменных. Язык программирования МАТ) АВ, являясь интерпретируемым языком сверхвысокого уровня, скрывает от пользователя операции, связанные с выделением и освобождением памяти.