GNU Octave — это научный язык программирования для научных вычислений и численных расчетов . Octave помогает в численном решении линейных и нелинейных задач, а также для выполнения других численных экспериментов с использованием языка, который в основном совместим с MATLAB . Он также может использоваться как пакетно-ориентированный язык. Как часть проекта GNU , он является свободным программным обеспечением в соответствии с условиями GNU General Public License .
Проект был задуман около 1988 года. [6] Сначала он планировался как дополнение к курсу по проектированию химических реакторов. Полная разработка была начата Джоном У. Итоном в 1992 году. Первый альфа-релиз датируется 4 января 1993 года, а 17 февраля 1994 года была выпущена версия 1.0. Версия 9.2.0 была выпущена 7 июня 2024 года. [7]
Программа названа в честь Октава Левеншпиля , бывшего профессора главного автора. Левеншпиль был известен своей способностью выполнять быстрые расчеты на скорую руку . [8]
Помимо использования на настольных компьютерах для персональных научных вычислений, Octave используется в академических кругах и промышленности. Например, Octave использовался на массивном параллельном компьютере в Питтсбургском суперкомпьютерном центре для поиска уязвимостей, связанных с угадыванием номеров социального страхования. [22]
Ускорение с OpenCL или CUDA также возможно с использованием графических процессоров. [23]
Язык Octave — это интерпретируемый язык программирования. Это структурированный язык программирования (похожий на C ) и он поддерживает множество общих функций стандартной библиотеки C , а также некоторые системные вызовы и функции UNIX . [24] Однако он не поддерживает передачу аргументов по ссылке [25], хотя аргументы функций копируются при записи, чтобы избежать ненужного дублирования.
Программы Octave состоят из списка вызовов функций или скрипта . Синтаксис основан на матрицах и предоставляет различные функции для матричных операций. Он поддерживает различные структуры данных и допускает объектно-ориентированное программирование . [26]
Его синтаксис очень похож на MATLAB, и тщательное программирование скрипта позволит запустить его как в Octave, так и в MATLAB. [27]
Поскольку Octave предоставляется по лицензии GNU General Public License , его можно свободно изменять, копировать и использовать. [8] Программа работает на Microsoft Windows и большинстве Unix и Unix-подобных операционных систем , включая Linux , Android и macOS . [28] [29] [30]
Ввод символа TAB в командной строке заставляет Octave пытаться завершить имена переменных, функций и файлов (аналогично дополнению Tab в Bash ). Octave использует текст перед курсором в качестве начальной части имени для завершения. [31]
При интерактивной работе Octave сохраняет введенные команды во внутреннем буфере, чтобы их можно было вызвать и отредактировать.
Octave включает ограниченную поддержку для организации данных в структуры. В этом примере мы видим структуру x с элементами a , b , и c , (целое число, массив и строка соответственно):
октава : 1 > x.a = 1 ; x.b = [ 1 , 2 ; 3 , 4 ] ; x.c = " струна " ; октава : 2 > x.a ans = 1 октава : 3 > x.b ans = 1 2 3 4октава : 4 > x . c ans = струна октава : 5 > x x = скалярная структура , содержащая поля : а = 1 б = 1 2 3 4 с = строка
Логические операторы Octave &&
и вычисляются по принципу короткого замыкания (как и соответствующие операторы в языке C ), в отличие от поэлементных операторов и .||
&
|
Octave включает в себя C-подобные операторы инкремента и декремента ++
в --
обеих их префиксных и постфиксных формах. Octave также выполняет расширенное присваивание , например x += 5
.
Octave поддерживает ограниченную форму обработки исключений, смоделированную по образцу unwind_protect из Lisp . Общая форма блока unwind_protect выглядит следующим образом:
unwind_protect тело unwind_protect_cleanup очистка end_unwind_protect
Как правило, GNU Octave распознает в качестве завершения заданного block
либо ключевое слово end
(совместимое с языком MATLAB), либо более конкретное ключевое слово или, в некоторых случаях, . Как следствие, блок может быть завершен либо ключевым словом , как в примере, либо более переносимым ключевым словом .endblock
end_block
unwind_protect
end_unwind_protect
end
Часть очистки блока выполняется всегда. В случае возникновения исключения частью тела , очистка выполняется немедленно перед распространением исключения за пределы блока unwind_protect
.
GNU Octave также поддерживает другую форму обработки исключений (совместимую с языком MATLAB):
попробуйте тело поймать исключение_обработка конец
Эта последняя форма отличается от unwind_protect
блока двумя способами. Во-первых, exception_handling выполняется только тогда, когда исключение вызвано body . Во-вторых, после выполнения exception_handling исключение не распространяется за пределы блока (если только rethrow( lasterror )
оператор явно не вставлен в код exception_handling ).
Octave имеет механизм для обработки функций, которые принимают неопределенное количество аргументов без явного верхнего предела. Чтобы указать список из нуля или более аргументов, используйте специальный аргумент varargin
как последний (или единственный) аргумент в списке. varargin
— это массив ячеек, содержащий все входные аргументы.
функция s = плюс ( varargin ) если ( nargin == 0 ) s = 0 ; иначе s = varargin { 1 } + плюс ( varargin { 2 : nargin }); конец конец
Функцию можно настроить на возврат любого количества значений, используя специальное возвращаемое значение varargout
. Например:
функция varargout = multiassign ( data ) для k = 1 : nargout varargout { k } = data (:, k ); конец конец
Также возможно выполнить код Octave напрямую в программе C++. Например, вот фрагмент кода для вызова rand([10,1])
:
#include <octave/oct.h> ... ColumnVector NumRands ( 2 ); NumRands ( 0 ) = 10 ; NumRands ( 1 ) = 1 ; octave_value_list f_arg , f_ret ; f_arg ( 0 ) = octave_value ( NumRands ); f_ret = feval ( "rand" , f_arg , 1 ); Матрица unis ( f_ret ( 0 ) .matrix_value ());
Код C и C++ можно интегрировать в GNU Octave, создав файлы oct или используя совместимые с MATLAB файлы MEX .
Octave был создан с учетом совместимости с MATLAB и имеет много общих функций с MATLAB:
Octave рассматривает несовместимость с MATLAB как ошибку ; следовательно, его можно считать клоном программного обеспечения , который не нарушает авторские права на программное обеспечение, как это было определено в судебном деле Lotus против Borland .
Скрипты MATLAB из репозитория MathWorks FileExchange в принципе совместимы с Octave. Однако, хотя они часто предоставляются и загружаются пользователями в соответствии с совместимой с Octave и надлежащей лицензией BSD с открытым исходным кодом , Условия использования FileExchange запрещают любое использование помимо MATLAB, принадлежащего MathWorks . [32] [33] [34]
Есть несколько целенаправленных, хотя и незначительных, дополнений к синтаксису. Архивировано 26.04.2012 на Wayback Machine :
Многие, но не все, из многочисленных функций MATLAB доступны в GNU Octave, некоторые из них доступны через пакеты в Octave Forge. Функции, доступные как часть основных пакетов Octave или Forge, перечислены онлайн Архивировано 2024-03-14 на Wayback Machine .
Список недоступных функций включен в функцию Octave __unimplemented.m__. Нереализованные функции также перечислены во многих пакетах Octave Forge в Octave Wiki.
При вызове нереализованной функции отображается следующее сообщение об ошибке:
octave : 1 > предупреждение о руководстве : функция « guide » еще не реализована в Octave Пожалуйста, прочтите < http : // www . octave . org / missing . html > , чтобы узнать , как вы можете внести свой вклад в отсутствующую функциональность . Ошибка : «руководство» не определено около строки 1 столбца 1
Octave поставляется с официальным графическим пользовательским интерфейсом (GUI) и интегрированной средой разработки (IDE) на основе Qt . Он был доступен с Octave 3.8, [35] и стал интерфейсом по умолчанию (поверх интерфейса командной строки ) с выпуском Octave 4.0. [12] Он был хорошо принят участником EDN, который написал «[Octave] теперь имеет очень работоспособный GUI» в обзоре тогда еще нового GUI в 2014 году. [36]
Также было разработано несколько сторонних графических интерфейсов, например ToolboX для обучения кодированию.
С кодом Octave пользователь может создавать приложения GUI. См. GUI Development (GNU Octave (версия 7.1.0)). Ниже приведены некоторые примеры:
Кнопка, элемент управления редактированием, флажок
# создаем фигуру и панель на ней f = figure ; # создаем кнопку (стиль по умолчанию) b1 = uicontrol ( f , "string" , "A Button" , "position" ,[ 10 10 150 40 ]); # создаем элемент управления редактированием e1 = uicontrol ( f , "style" , "edit" , "string" , "editable text" , "position" ,[ 10 60 300 40 ]); # создаем флажок c1 = uicontrol ( f , "style" , "checkbox" , "string" , "a checkbox" , "position" ,[ 10 120 150 40 ]);
Текстовое поле
prompt = { "Ширина" , "Высота" , "Глубина" }; defaults = { "1.10" , "2.20" , "3.30" }; rowscols = [ 1 , 10 ; 2 , 20 ; 3 , 30 ]; dims = inputdlg ( prompt , "Введите размеры поля" , rowscols , defaults );
Список с полями сообщений.
my_options = { "Элемент" , "еще один" , "еще один" }; [ sel , ok ] = listdlg ( "ListString" , my_options , "SelectionMode" , "Multiple" ); if ( ok == 1 ) msgbox ( "Вы выбрали:" ); for i = 1 : numel ( sel ) msgbox ( sprintf ( "\t%s" , my_options { sel ( i )})); endfor else msgbox ( "Вы отменили." ); endif
Радиокнопки
# создаем фигуру и панель на ней f = figure ; # создаем группу кнопок gp = uibuttongroup ( f , "Position" , [ 0 0.5 1 1 ]) # создаем кнопки в группе b1 = uicontrol ( gp , "style" , "radiobutton" , "string" , "Choice 1" , "Position" , [ 10 150 100 50 ]); b2 = uicontrol ( gp , "style" , "radiobutton" , "string" , "Choice 2" , "Position" , [ 10 50 100 30 ]); # создаем кнопку не в группе b3 = uicontrol ( f , "style" , "radiobutton" , "string" , "Not in the group" , "Position" , [ 10 50 100 50 ]);
Octave также имеет множество доступных пакетов. Эти пакеты находятся на Octave-Forge Octave Forge - Packages или Github Octave Packages. Также любой может создавать и поддерживать пакеты.
Альтернативы GNU Octave под лицензией с открытым исходным кодом , помимо вышеупомянутого MATLAB, включают Scilab и FreeMat . [37] [38] [39] [40] Octave более совместим с MATLAB, чем Scilab, [37] [41] [42] а FreeMat не обновлялся с июня 2013 года. [43]
Кроме того, язык программирования Julia и его возможности построения графиков имеют сходство с GNU Octave.