B.2 Функции демонстрации
- : demo name ¶
- : demo name n ¶
- : demo ("name") ¶
- : demo ("name", n) ¶
-
Запустить блок демонстрационного кода n, связанный с функцией name.
Если n не указано, выполняются все примеры.
Предпочтительное место для блоков демонстрационного кода — вложение в файл скрипта m-файла непосредственно после кода, который он выполняет. В качестве альтернативы, примеры могут храниться в файле с тем же именем, но без расширения, расположенном в пути загрузки Octave. Для разделения примеров от обычного кода скрипта все строки предваряются
%!. Каждый пример также должен быть представлен ключевым словом"demo"выровненным слева по отношению к префиксу без промежутков. Остальная часть примера может содержать произвольный код Octave. Например:%!demo %! t = 0:0.01:2*pi; %! x = sin (t); %! plot (t, x); %! title ("one cycle of a sine wave"); %! #------------------------------------------------- %! # the figure window shows one cycle of a sine waveОбратите внимание, что код отображается перед его выполнением, поэтому простого комментария в конце достаточно для обозначения отображаемого кода. Для графиков маркировка также может быть выполнена с помощью
titleилиtext. В большинстве случаев использованиеdispилиprintfвнутри демонстрации не требуется.Демонстрации выполняются в автономной среде функций без доступа к внешним переменным. Это означает, что каждый демон должен иметь отдельный код инициализации. В качестве альтернативы, все демонстрации можно объединить в одну большую демонстрацию с кодом
%! input ("Press <enter> to continue: ", "s");между разделами, но такое использование не рекомендуется. Другие методы для предотвращения множественных блоков инициализации включают использование нескольких графиков с новой
figureкомандой между каждым графиком или использованиеsubplotдля размещения нескольких графиков в одном окне.Наконец, поскольку
demoоценивается в контексте функции, невозможно определять новые функции внутри кода. Анонимные функции являются хорошей заменой в большинстве случаев. Если блоки функций обязательно использовать, то кодeval (example ("function", n))позволит Octave их увидеть. Однако это имеет свои проблемы, посколькуevalоценивает только одну строку или оператор за раз. В этом случае объявление функции должно быть заключено в"if 1 <demo stuff> endif"где"if"находится в одной строке с"demo". Например:%!demo if 1 %! function y = f(x) %! y = x; %! endfunction %! f(3) %! endif
- : example name ¶
- : example name n ¶
- : example ("name") ¶
- : example ("name", n) ¶
- : [codestr, codeidx] = example (…) ¶
-
Отобразить код примера n, связанный с функцией name, но не выполнять его.
Если n не указано, отображаются все примеры.
При вызове с выходными аргументами примеры возвращаются в виде строки codestr, где codeidx указывает конечную позицию различных примеров.
Для полного объяснения см.
demo.
- : oruntests () ¶
- : oruntests (directory) ¶
-
Выполнить встроенные тесты для всех m-файлов в указанной directory.
Блоки тестов в любых файлах C++-кода (*.cc) также будут выполнены для использования с динамически связанными функциями oct-файлов.
Если каталог не указан, операции выполняются для всех каталогов в пути поиска функций Octave.
- : rundemos () ¶
- : rundemos (directory) ¶
-
Выполнить встроенные демонстрации для всех m-файлов в указанном directory.
Блоки демонстраций в любых файлах C++-кода (*.cc) также будут выполнены для использования с динамически связанными функциями oct-файлов.
Если каталог не указан, операции выполняются для всех каталогов в пути поиска функций Octave.
- : speed (f, init, max_n, f2, tol) ¶
- : [order, n, T_f, T_f2] = speed (…) ¶
-
Определить время выполнения выражения (f) для различных значений входных данных (n).
n меняются с логарифмической интерполяцией от 1 до max_n. Для каждого n вычисляется выражение инициализации (init) для создания необходимых данных для теста. Если задано второе выражение (f2), то сравниваются времена выполнения двух выражений. При вызове без выходных аргументов результаты выводятся в стандартный вывод и отображаются графически.
f-
Выражение кода для вычисления.
max_n-
Максимальная длина теста для выполнения. Значение по умолчанию равно 100. В качестве альтернативы используйте
[min_n, max_n]или укажите n точно с[n1, n2, …, nk]. init-
Выражение инициализации для значений аргументов функции. Используйте k для номера теста и n для размера теста. Это должно вычислять значения для всех переменных, используемых f. Обратите внимание, что init будет вычисляться сначала для k = 0, поэтому вещи, которые являются постоянными на протяжении всей серии тестов, могут быть вычислены один раз. Значение по умолчанию —
x = randn (n, 1). f2-
Альтернативное выражение для вычисления, чтобы скорость двух выражений можно было сравнить напрямую. По умолчанию —
[]. tol-
Допуск, используемый для сравнения результатов выражения f и выражения f2. Если tol положительно, то допуск абсолютный. Если tol отрицательно, то допуск относительный. По умолчанию —
eps. Если tol —Inf, сравнение не будет произведено. order-
Временная сложность выражения O(a*n^p). Это структура с полями
aиp. n-
Значения n, для которых выражение было вычислено И время выполнения было больше нуля.
T_f-
Зафиксированные ненулевые времена выполнения выражения f в секундах.
T_f2-
Зафиксированные ненулевые времена выполнения выражения f2 в секундах. При необходимости среднее отношение времени — просто
mean (T_f ./ T_f2).
Уклон графика времени выполнения показывает приблизительную степень асимптотического времени выполнения O(n^p). Эта степень отображается для области, в которой она аппроксимируется (вторая половина графика). Оценённая степень не очень точная, но должна быть достаточной для определения общего порядка алгоритма. Она должна указать, если, например, реализация неожиданно O(n^2), а не O(n), потому что она расширяет вектор каждый раз при проходе по циклу, а не предварительно выделяет память. В текущей версии Octave следующее не является ожидаемым O(n).
speed ("for i = 1:n, y{i} = x(i); endfor", "", [1000, 10000])Но это так, если вы предварительно выделяете массив ячеек
y:speed ("for i = 1:n, y{i} = x(i); endfor", ... "x = rand (n, 1); y = cell (size (x));", [1000, 10000])Делается попытка приблизить стоимость отдельных операций, но она ужасно неточна. Вы можете немного улучшить устойчивость, выполняя больше работы для каждого
n. Например:speed ("airy(x)", "x = rand (n, 10)", [10000, 100000])При сравнении двух разных выражений (f, f2) наклон линии на графике отношения ускорения должен быть больше 1, если новое выражение быстрее. Лучшие алгоритмы имеют более пологий наклон. Обычно векторизация алгоритма не изменит наклон графика времени выполнения, но сместит его относительно исходного. Например:
speed ("sum (x)", "", [10000, 100000], ... "v = 0; for i = 1:length (x), v += x(i); endfor")Следующий пример более сложный. Если была исходная версия
xcorrс циклами for и вторая версия с FFT, то можно сравнить скорость выполнения для различных лагов следующим образом или для фиксированного лага с различными длинами векторов следующим образом:speed ("xcorr (x, n)", "x = rand (128, 1);", 100, "xcorr_orig (x, n)", -100*eps) speed ("xcorr (x, 15)", "x = rand (20+n, 1);", 100, "xcorr_orig (x, n)", -100*eps)Предполагая, что одна из двух версий находится в xcorr_orig, это сравнило бы их скорость и значения выходных данных. Обратите внимание, что версия FFT не точна, поэтому необходимо указать допустимый допуск для сравнения
100*eps. В этом случае сравнение должно быть вычислено относительно, какabs ((x - y) ./ y)а не абсолютно, какabs (x - y).Введите example ("speed"), чтобы увидеть некоторые реальные примеры, или demo ("speed"), чтобы их выполнить.
© 1996–2023 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v8.1.0/Demonstration-Functions.html