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) ¶
- : [s, idx] = example (…) ¶
-
Отобразить код примера n, связанный с функцией name, но не выполнять его.
Если n не указан, отображаются все примеры.
При вызове с выходными аргументами, примеры возвращаются в виде строки s, где idx указывает конечную позицию различных примеров.
Для полного объяснения см.
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), потому что она расширяет вектор каждый раз при проходе по циклу, а не предварительно выделяет память.
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–2022 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/v7.2.0/Demonstration-Functions.html