MATLAB (аббревиатура от «MATrix LABoratory» [22] ) — это запатентованный многопарадигмальный язык программирования и среда числовых вычислений , разработанная MathWorks . MATLAB позволяет выполнять матричные манипуляции, строить графики функций и данных, реализовывать алгоритмы , создавать пользовательские интерфейсы и взаимодействовать с программами, написанными на других языках.
Хотя MATLAB предназначен в первую очередь для численных вычислений, дополнительный набор инструментов использует символьный движок MuPAD , предоставляя доступ к возможностям символьных вычислений . Дополнительный пакет Simulink добавляет графическое многодоменное моделирование и проектирование на основе моделей для динамических и встроенных систем .
По состоянию на 2020 год [update]MATLAB имеет более четырех миллионов пользователей по всему миру. [23] Они имеют разный опыт в области инженерии , науки и экономики . По состоянию на 2017 год [update]более 5000 мировых колледжей и университетов используют MATLAB для поддержки обучения и исследований. [24]
MATLAB был изобретен математиком и программистом Кливом Молером . [25] Идея MATLAB была основана на его докторской диссертации 1960-х годов. [25] Молер стал профессором математики в Университете Нью-Мексико и начал разрабатывать MATLAB для своих студентов [25] в качестве хобби. [26] Он разработал первоначальное программирование линейной алгебры MATLAB в 1967 году вместе со своим бывшим научным руководителем Джорджем Форсайтом . [25] За этим последовал код Fortran для линейных уравнений в 1971 году. [25]
До версии 1.0 MATLAB «не был языком программирования; это был простой интерактивный матричный калькулятор. Не было ни программ, ни наборов инструментов, ни графики. И никаких ОДУ или БПФ ». [27]
Первая ранняя версия MATLAB была завершена в конце 1970-х годов. [25] Программное обеспечение было впервые представлено общественности в феврале 1979 года в Военно-морской аспирантуре в Калифорнии. [26] Ранние версии MATLAB представляли собой простые матричные калькуляторы с 71 встроенной функцией. [28] В то время MATLAB распространялся бесплатно [29] [30] в университетах. [31] Молер оставлял копии в университетах, которые посещал, и программное обеспечение приобрело большую популярность на математических факультетах университетских кампусов. [32] : 5
В 1980-х годах Клив Молер встретил Джона Н. Литтла . Они решили перепрограммировать MATLAB на C и продавать его для настольных компьютеров IBM, которые в то время заменяли мэйнфреймы. [25] Джон Литтл и программист Стив Бангерт перепрограммировали MATLAB на C, создали язык программирования MATLAB и разработали функции для наборов инструментов. [26]
С 1993 года доступны альтернативные версии с открытым исходным кодом — GNU Octave (в основном совместимый с Matlab) и scilab (похожий на Matlab).
MATLAB был впервые выпущен как коммерческий продукт в 1984 году на конференции по автоматическому управлению в Лас-Вегасе . [25] [26] Для разработки программного обеспечения была основана компания MathWorks , Inc. [30] и был выпущен язык программирования MATLAB. [28] Первая продажа MATLAB состоялась в следующем году, когда Ник Трефетен из Массачусетского технологического института купил десять копий. [26] [33]
К концу 1980-х годов несколько сотен копий MATLAB были проданы университетам для использования студентами. [26] Программное обеспечение стало популярным во многом благодаря наборам инструментов, созданным экспертами в различных областях для выполнения специализированных математических задач. [29] Многие из наборов инструментов были разработаны в результате того, что студенты Стэнфорда использовали MATLAB в академической среде, а затем принесли программное обеспечение с собой в частный сектор. [26]
Со временем MATLAB был переписан для ранних операционных систем, созданных Digital Equipment Corporation , VAX , Sun Microsystems , и для ПК с ОС Unix. [26] [28] Версия 3 была выпущена в 1987 году. [34] Первый компилятор MATLAB был разработан Стивеном С. Джонсоном в 1990-х годах. [28]
В 2000 году MathWorks добавила библиотеку на основе Fortran для линейной алгебры в MATLAB 6, заменив оригинальные подпрограммы LINPACK и EISPACK, которые были на C. [28] Parallel Computing Toolbox от MATLAB был представлен на Суперкомпьютерной конференции 2004 года, а поддержка графических процессоров (GPU) была добавлена в него в 2010 году. [28]
Некоторые особенно крупные изменения в программном обеспечении были сделаны в версии 8 в 2012 году. [35] Пользовательский интерфейс был переработан [ необходима ссылка ] и функциональность Simulink была расширена. [ 36] К 2016 году MATLAB представил несколько технических и пользовательских улучшений интерфейса, включая блокнот MATLAB Live Editor и другие функции. [28]
Приложение MATLAB построено на языке программирования MATLAB. Обычное использование приложения MATLAB подразумевает использование «Командного окна» в качестве интерактивной математической оболочки или выполнение текстовых файлов, содержащих код MATLAB. [37]
Пример программы «Hello, world!» существует в MATLAB.
disp ( 'Привет, мир!' )
Это отображается так:
Привет, мир!
Переменные определяются с помощью оператора присваивания, =
. MATLAB является слабо типизированным языком программирования, поскольку типы преобразуются неявно. [38] Это выведенный типизированный язык, поскольку переменные могут быть назначены без объявления их типа, за исключением случаев, когда они должны рассматриваться как символические объекты, [39] и их тип может изменяться. Значения могут быть получены из констант , из вычислений, включающих значения других переменных, или из выходных данных функции. Например:
>> х = 17 х = 17 >> x = 'шляпа' x = шляпа >> х = [ 3 * 4 , пи / 2 ] х = 12,0000 1,5708 >> y = 3 * sin ( x ) y = -1,6097 3,0000
Простой массив определяется с помощью синтаксиса двоеточия: начальный :
инкремент :
терминатор . Например:
>> массив = 1 : 2 : 9 массив = 1 3 5 7 9
определяет переменную с именем array
(или присваивает новое значение существующей переменной с именем array
), которая представляет собой массив, состоящий из значений 1, 3, 5, 7 и 9. То есть массив начинается с 1 ( начальное значение), увеличивается с каждым шагом от предыдущего значения на 2 ( значение приращения ) и останавливается, когда достигает (или почти превышает) 9 ( значение конца ).
Значение приращения на самом деле можно исключить из этого синтаксиса (вместе с одним из двоеточий), чтобы использовать значение по умолчанию 1.
>> ари = 1 : 5 ари = 1 2 3 4 5
присваивает переменной с именем ari
массив со значениями 1, 2, 3, 4 и 5, поскольку в качестве приращения используется значение по умолчанию 1.
Индексация начинается с единицы [40], что является обычным соглашением для матриц в математике, в отличие от индексации, начинающейся с нуля, которая обычно используется в других языках программирования, таких как C, C++ и Java.
Матрицы можно определить, разделив элементы строки пробелом или запятой и используя точку с запятой для разделения строк. Список элементов должен быть заключен в квадратные скобки []
. Скобки ()
используются для доступа к элементам и подмассивам (они также используются для обозначения списка аргументов функции).
>> А = [ 16 , 3 , 2 , 13 ; 5 , 10 , 11 , 8 ; 9 , 6 , 7 , 12 ; 4 , 15 , 14 , 1 ] А = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1 >> A ( 2 , 3 ) ответ = 11
Наборы индексов могут быть заданы выражениями, такими как 2:4
, что вычисляется как [2, 3, 4]
. Например, подматрица, взятая из строк 2–4 и столбцов 3–4, может быть записана как:
>> А ( 2 : 4 , 3 : 4 ) ans = 11 8 7 12 14 1
Квадратную единичную матрицу размера n можно сгенерировать с помощью функции eye
, а матрицы любого размера с нулями или единицами можно сгенерировать с помощью функций zeros
и ones
, соответственно.
>> глаз ( 3 , 3 ) ответ = 1 0 0 0 1 0 0 0 1>> нули ( 2 , 3 ) ответ = 0 0 0 0 0 0>> единицы ( 2 , 3 ) ответы = 1 1 1 1 1 1
Транспонирование вектора или матрицы выполняется либо функцией transpose
, либо добавлением точки-штриха после матрицы (без точки штрих будет выполнять сопряженное транспонирование для комплексных массивов):
>> A = [ 1 ; 2 ], B = A . ' , C = транспонировать ( A ) A = 1 2 B = 1 2 C = 1 2 >> Д = [ 0 , 3 ; 1 , 5 ] , Д. ' D = 0 3 1 5 ans = 0 1 3 5
Большинство функций принимают массивы в качестве входных данных и работают поэлементно с каждым элементом. Например, mod(2*J,n)
умножит каждый элемент в J на 2, а затем уменьшит каждый элемент по модулю n . MATLAB включает стандартные for
и while
циклы, но (как и в других подобных приложениях, таких как APL и R ), использование векторизованной нотации рекомендуется и часто выполняется быстрее. Следующий код, взятый из функции magic.m , создает магический квадрат M для нечетных значений n (функция MATLAB meshgrid
используется здесь для генерации квадратных матриц I и J , содержащих ):
[ J , I ] = сеткасетка ( 1 : n ); A = mod ( I + J - ( n + 3 ) / 2 , n ); B = mod ( I + 2 * J - 2 , n ); M = n * A + B + 1 ;
MATLAB поддерживает типы структурных данных. [41] Поскольку все переменные в MATLAB являются массивами, более адекватным названием будет «структурный массив», где каждый элемент массива имеет одинаковые имена полей. Кроме того, MATLAB поддерживает динамические имена полей [42] (поиск полей по имени, манипуляции с полями и т. д.).
При создании функции MATLAB имя файла должно совпадать с именем первой функции в файле. Допустимые имена функций начинаются с буквенного символа и могут содержать буквы, цифры или символы подчеркивания. Переменные и функции чувствительны к регистру. [43]
rgbImage = imread ( 'ecg.png' ); grayImage = rgb2gray ( rgbImage ); % для неиндексированных изображений level = graythresh ( grayImage ); % порог для преобразования изображения в двоичный, binaryImage = im2bw ( grayImage , level ); % Извлечь отдельные каналы красного, зеленого и синего цветов. redChannel = rgbImage (:, :, 1 ); greenChannel = rgbImage (:, :, 2 ); blueChannel = rgbImage (:, :, 3 ); % Сделать черные части чисто красными. redChannel ( ~ binaryImage ) = 255 ; greenChannel ( ~ binaryImage ) = 0 ; blueChannel ( ~ binaryImage ) = 0 ; % Теперь объединим для формирования выходного изображения. rgbImageOut = cat ( 3 , красныйКанал , зеленыйКанал , синийКанал ); imshow ( rgbImageOut );
MATLAB поддерживает элементы лямбда-исчисления , вводя дескрипторы функций [44] или ссылки на функции, которые реализованы либо в файлах .m, либо в анонимных [45] /вложенных функциях. [46]
MATLAB поддерживает объектно-ориентированное программирование, включая классы, наследование , виртуальную диспетчеризацию, пакеты, семантику передачи по значению и семантику передачи по ссылке . [47] Однако синтаксис и соглашения о вызовах существенно отличаются от других языков. MATLAB имеет классы значений и классы ссылок, в зависимости от того, имеет ли класс handle как суперкласс (для классов ссылок) или нет (для классов значений). [48]
Поведение вызова метода отличается между классами значений и ссылочными классами. Например, вызов метода:
объект . метод ();
может изменить любой член объекта, только если объект является экземпляром ссылочного класса, в противном случае методы класса значений должны возвращать новый экземпляр, если необходимо изменить объект.
Пример простого класса приведен ниже:
classdef Hello методы function greet ( obj ) disp ( 'Hello!' ) end end end
Если поместить его в файл с именем hello.m
, его можно выполнить с помощью следующих команд:
>> x = Привет (); >> x . greet (); Привет!
MATLAB имеет тесно интегрированные функции построения графиков. Например, функция plot может быть использована для создания графика из двух векторов x и y . Код:
х = 0 : пи / 100 : 2 * пи ; у = грех ( х ); сюжет ( х , у )
дает следующую фигуру синусоидальной функции :
MATLAB также поддерживает трехмерную графику:
MATLAB поддерживает разработку приложений с графическим пользовательским интерфейсом (GUI). [49] Пользовательские интерфейсы могут быть созданы либо программно, либо с использованием визуальных сред проектирования, таких как GUIDE и App Designer . [50] [51]
MATLAB может вызывать функции и подпрограммы, написанные на языках программирования C или Fortran . [52] Создается функция-обертка, позволяющая передавать и возвращать типы данных MATLAB. Файлы MEX (исполняемые файлы MATLAB) — это динамически загружаемые объектные файлы, созданные путем компиляции таких функций. [53] [54] С 2014 года добавляется все больше двусторонних интерфейсов с Python . [55] [56]
Библиотеки, написанные на Perl , Java , ActiveX или .NET, можно вызывать напрямую из MATLAB, [57] [58], и многие библиотеки MATLAB (например, поддержка XML или SQL ) реализованы как оболочки вокруг библиотек Java или ActiveX. Вызов MATLAB из Java более сложен, но может быть выполнен с помощью набора инструментов MATLAB [59] , который продается отдельно MathWorks , или с помощью недокументированного механизма, называемого JMI (интерфейс Java-to-MATLAB), [60] [61] (который не следует путать с несвязанным интерфейсом метаданных Java , который также называется JMI). Официальный API MATLAB для Java был добавлен в 2016 году. [62]
В качестве альтернативы набору инструментов Symbolic Math Toolbox на базе MuPAD , доступному в MathWorks, MATLAB можно подключить к Maple или Mathematica . [63] [64]
Существуют также библиотеки для импорта и экспорта MathML . [65]
В 2020 году MATLAB прекратила предоставлять услуги двум китайским университетам из-за санкций США. Университеты заявили, что на это отреагируют более широким использованием альтернатив с открытым исходным кодом и разработкой внутренних альтернатив. [66]
образом, APL, Speakeasy, LINPACK, EISPACK и PL0 были предшественниками MATLAB.