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]
Libraries written in Perl, Java, ActiveX or .NET can be directly called from MATLAB,[57][58] and many MATLAB libraries (for example XML or SQL support) are implemented as wrappers around Java or ActiveX libraries. Calling MATLAB from Java is more complicated, but can be done with a MATLAB toolbox[59] which is sold separately by MathWorks, or using an undocumented mechanism called JMI (Java-to-MATLAB Interface),[60][61] (which should not be confused with the unrelated Java Metadata Interface that is also called JMI). Official MATLAB API for Java was added in 2016.[62]
As alternatives to the MuPAD based Symbolic Math Toolbox available from MathWorks, MATLAB can be connected to Maple or Mathematica.[63][64]
Libraries also exist to import and export MathML.[65]
In 2020, MATLAB withdrew services from two Chinese universities as a result of US sanctions. The universities said this will be responded to by increased use of open-source alternatives and by developing domestic alternatives.[66]
образом, APL, Speakeasy, LINPACK, EISPACK и PL0 были предшественниками MATLAB.