Какой язык программирования в matlab. Краткая характеристика MATLAB

Какой язык программирования в matlab. Краткая характеристика MATLAB

Те, кто имеет дело с высшей математикой, прекрасно знают, с какими математическими «чудовищами» иногда приходится сталкиваться. Например, на вычисление какого-нибудь гигантского тройного интеграла можно потратить настоящую уйму времени, душевных сил и не восстанавливающихся нервных клеток. Конечно, это очень интересно, бросить вызов интегралу, и взять его. Но, что делать, если вместо этого интеграл грозиться взять Вас? Или, что еще хуже, кубический трехчлен вышел из-под контроля и разбушевался? Такого и врагу не пожелаешь.


Раньше вариантов было всего два: плюнуть на все и пойти гулять или вступить в многочасовую схватку с интегралом. Ну, кому многочасовую, кому многоминутную – кто как учился. Но суть не в этом. Двадцатый век и неумолимо движущийся прогресс предлагают нам третий способ, а именно позволяют взять самый сложный интеграл «по-быстрому». То же самое касается решения всевозможных уравнений, построения графиков функций в виде кубических гиперболоидов и т.д.

Для таких неординарных, но периодически случающихся среди студентов ситуаций существует мощное математическое оружие. Встречайте, кто еще не знает – пакет программ MATLAB.

Матлаб и решит уравнение, и аппроксимирует, и построит график функции. Понимаете, что это значит, друзья?

Это значит, что – один из мощнейших на сегодняшний день пакетов обработки данных. Название расшифровывается как Matrix Laboratory. Матричная Лаборатория, если по-русски. Возможности программы покрывают практически все области математики. Так, пользуясь матлабом, Вы сможете:

  • Производить всевозможные операции над матрицами, решать линейные уравнения, работать с векторами;
  • Вычислять корни многочленов любой степени, производить операции над многочленами, дифференцировать, экстраполировать и интерполировать кривые, строить графики любых функций;
  • Проводить статистический анализ данных с использованием цифровой фильтрации, статистической регрессии;
  • Решать дифференциальные уравнения. В частных производных, линейных, нелинейных, с граничными условиями – не важно, матлаб все решит;
  • Выполнять операции целочисленной арифметики.

Помимо всего этого возможности MATLAB позволяют визуализировать данные вплоть до построения трехмерных графиков и создания анимированных роликов.

Наше описание матлаб, конечно, далеко не полное. Помимо предусмотренных производителем возможностей и функций существует огромное количество инструментов матлаб, написанных просто энтузиастами или другими компаниями.

MATLAB как язык программирования


А еще – это язык программирования, используемый непосредственно при работе с программой. Не будем вдаваться в подробности, скажем только, что программы, написанные на языке MATLAB, бывают двух видов: функции и скрипты.


Основной рабочий файл программы – М-файл. Это бесконечный текстовый файл, и именно в нем происходит непосредственно программирование вычислений. Кстати, пусть Вас не пугает это слово – для того, чтобы работать в MATLAB, вовсе не нужно быть профессиональным программистом.

М-файлы делятся на

  • М-сценарии. М-сценарий – самый простой тип M-файла, у которого отсутствуют входные и выходные аргументы. Данный файл используется для автоматизации многократно повторяемых вычислений.
  • M-функции. М-функции – это М-файлы, допускающие наличие входных и выходных аргументов.

Для того чтобы наглядно показать, как происходит работа в MATLAB, приведем ниже пример создания функции в матлабе. Данная функция будет вычислять среднее значение вектора.
f unction y = average (x)
% AVERAGE Среднее значение элементов вектора.
% AVERAGE(X), где X - вектор. Вычисляет среднее значение элементов вектора.
% Если входной аргумент не является вектором, генерируется ошибка.
= size(x);
if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))
error("Входной массив должен быть вектором’)
end
y =sum(x)/length(x); % Собственно вычисление

Строка определения функции сообщает системе MATLAB, что файл является М-функцией, а также определяет список входных аргументов. Так, строка определения функции average имеет вид:
function y = average(x)
Где:

  1. function - ключевое слово, определяющее М-функцию;
  2. y - выходной аргумент;
  3. average - имя функции;
  4. x - входной аргумент.

Итак, чтобы написать функцию в матлабе, необходимо помнить, что каждая функция в системе MATLAB содержит строку определения функции, подобную приведенной.

Безусловно, такой мощный пакет нужен не только для того, чтобы облегчить жизнь студентам. В настоящее время MATLAB, с одной стороны, очень популярен среди специалистов многих научных и инженерных отраслей. С другой стороны, возможность работы с большими матрицами делает MATLAB незаменимым инструментом финансовых аналитиков, позволяющим решить намного больше задач, чем, к примеру, известный всем Excel. Подробнее о том, вы можете прочитать в обзорной статье.

Недостатки работы с MATLAB


Какие есть трудности в работе с MATLAB? Трудность, пожалуй, всего одна. Но фундаментальная. Чтобы полностью раскрыть возможности MATLAB и с легкостью решать встающие перед Вами задачи, придется попотеть и сначала разобраться с самим матлабом (как создать файл, как создать функцию и др.). А это не так просто, ибо мощность и широкие возможности требуют жертв.

При всем желании нельзя сказать, что MATLAB – простая программа. Тем не менее, надеемся, все вышеперечисленное будет достаточным аргументом для того, чтобы взяться за ее освоение.

И напоследок. Если Вы не знаете, почему все в Вашей жизни пошло так, а не иначе, спросите об этом у матлаба. Просто наберите в командной строке “why” (почему). Он ответит. Попробуйте!

Теперь вы знаете возможности Матлаб. В области образования MATLAB часто используется в преподавании численных методов и линейной алгебры. Многим студентам не обойтись без него при обработке результатов эксперимента, проведенного в ходе лабораторной работы. Для быстрого и качественного освоения основ работы с MATLAB Вы всегда можете обратиться к , в любой момент готовым ответить на любой Ваш вопрос.

Несмотря на достаточно высокую популярность языка MATLAB , большинство разработчиков с трудом представляет, как его синтаксис, так и возможности. Всё дело в том, что язык напрямую связан с популярным программным продуктом, стоимость которого может достигать потрясающих воображение значений. Итак, главный вопрос: так ли хорош непосредственно язык Matlab? И может ли он быть полезен именно вам.

Использование

Начнём не со стандартного экскурса в историю и обсуждения плюсов и минусов языка, а с программной среды MATLAB/Simulink - единственного места, где герой этого текста может быть полезен. Просто представьте себе графический редактор, в котором вы сможете реализовать любую свою задумку, не имея за плечами нескольких лет опыта и соответствующего образования. И создав один раз схему взаимодействия инструментов, получить качественный скрипт для многократного использования.

MATLAB - именно такой редактор в мире данных. Область его применения безгранично широка: IoT, финансы, медицина, космос, автоматика, робототехника, беспроводные системы и многое-многое другое. В общем почти неограниченные возможности по сбору и визуализации данных, а также прогнозированию, но только если есть возможность купить соответствующий пакет.

Что касается цены, то в верхней границы почти нет, а вот нижняя находится в район 99$. Чтобы урвать столь мощный продукт за относительно небольшие деньги, вам необходимо быть студентом ВУЗа. И конечно же вы получите довольно ограниченный продукт.

Особенности языка

Язык MATLAB - инструмент, обеспечивающий взаимодействие оператора (часто даже не программиста) со всеми доступными возможностями анализа, сбора и представления данных. У него есть очевидные плюсы и минусы, свойственные языку живущему в замкнутой экосистеме.

Недостатки:

    Медленный и перегруженный операторами, командами, функциями язык, основной целью которого является улучшение визуального восприятия.

    Узконаправленный. Нет никакой больше программной платформы, где бы MATLAB был полезен.

    Дороговизна ПО. Если вы не студент - либо готовьтесь опустошить карманы или перейти границу закона. И даже если студент - цена приличная.

    Невысокий спрос. Несмотря на большой интерес к MATLAB практически во всех сферах, фактически и легально его используют лишь немногие.

Достоинства:

    Язык легок для изучения, обладает простым и понятным синтаксисом.

    Огромные возможности. Но это скорее преимущество всего продукта в целом.

    Частые обновления, как правило заметные положительные преобразования происходят не реже пары раз в год.

    Программная среда позволяет преобразовывать его в “быстрый” код на С, С++.

Целевая аудитория

Разумеется, MATLAB нужен далеко не всем. Несмотря на широчайшую область применения, трудно представить, что рядовому разработчику приложений может понадобиться знание этого языка. MATLAB крайне полезен в областях, требующих особой надёжности при обработке данных, например, в системах автопилота в автомобилях или бортовых электронных системах самолёта.

То есть если вы не очень программист, но так или иначе ваша профессия связана с необходимостью программной обработки данных, то продукт MATLAB/Simulink с соответствующим языком способны сильно упростить ваши каждодневные задачи.

Литература

Завершаем обзор языка как всегда списком учебной литературы. Само-собой среди них вы не отыщите книг исключительно по языку, но от этого восприятие языка будет только проще:

А у вас есть опыт работы с MATLAB? И какой?

Для тех, кто хочет стать программистом - .

Размещено на http://www.allbest.ru/

Введение

Название пакета Matlab является сокращением от английского Matrix Laboratory (что означает матричная лаборатория ). Этим же термином (то есть Matlab) называют и язык программирования, используемый для составления программных кодов. Как известно, программный код может компилироваться или интерпретироваться . В первом случае получаем исполнительный (машинный) код, который выполняется центральным процессором. При интерпретации происходит преобразование в промежуточный код, который выполняется непосредственно системой-интерпретатором. Скомпилированный код обычно выполняется быстрее, чем интерпретируемый код. Вместе с тем интерпретируемые языки программирования, как правило, более демократичны в плане синтаксиса. Программный код Matlab интерпретируется. Однако это никак не ставит под сомнение вычислительные возможности Matlab. Основой для реализации разных типов данных в Matlab являются матрицы , что объясняет многие особенности среды (и языка программирования) Matlab. К матрицам мы будем достаточно часто апеллировать по ходу изложения материала книги.

Значительная часть функциональных возможностей приложения Matlab реализована через пакеты инструментов (английский термин toolbox ). Это коллекции функций и других утилит, предназначенных для решения узко специальных задач. Большинство пакетов имеют узкую, специфическую направленность. Приложение Matlab предназначено (в первую очередь) для выполнения числовых расчетов и визуализации получаемых результатов. Пакет содержит огромное число утилит для выполнения самых разных операций и позволяет создавать собственные полнофункциональные программные коды. Вместе с тем в Matlab могут выполняться и символьные расчеты. Этой цели служит встроенная в Matlab среда MuPAD. Таким образом, пользователю Matlab предоставляются широкие возможности не только в области числовых, но и символьных расчетов.

1. Простые вычисления

Под простыми, или пошаговыми, подразумевают вычисления, обычно выполняемые в командном окне приложения Matlab. Соответствующая инструкция или команда вводится в командном окне и затем выполняется. На рисунке 1 показано, как может выглядеть рабочее окно приложения Matlab при запуске. Интерес в данном случае представляет внутреннее окно (обычно в центре рабочего окна приложения) с названием Command Window - командное окно. В этом окне можно заметить индикатор строки ввода (в виде двойной стрелки >> ). Для ввода команды курсор необходимо переместить после индикатора строки ввода и ввести инструкцию для выполнения. Другими словами, в строку ввода командного окна необходимо ввести выражение и, нажав клавишу «Enter», запустить процесс вычисления этого выражения. Результат вычислений отображается внизу, под выполняемой командой. По умолчанию результат заносится в системную переменную «ans».

Рисунок 1

На рисунке 2 приведен пример вычисления нескольких арифметических выражений. В данном случае приведены результаты вычисления выражений 1+2*3 и (5^2-4)/7 соответственно. В первом случае, как и ожидалось, получаем в качестве результата значение 7, во втором - значение 3.

Рисунок 2

В качестве основных арифметических операторов в Matlab используются: оператор «+» для вычисления суммы, оператор «-» для вычисления разности, оператор «*» для вычисления произведения, оператор «/» для вычисления частного и оператор «^» для возведения в степень.

В общем смысле переменная - это область памяти, к которой можно обращаться по имени для получения значения, записанного в этой области, а также его изменения. В строго типизированных языках программирования (таких, как С++, Java или Pascal) для использования переменной необходимо предварительно ее объявить, указав при этом, к какому типу она относится. В Matlab ничего подобного делать не нужно. Переменной сразу можно присваивать значение. В качестве оператора присваивания используется знак равенства «=». Имя переменной, которой присваивается значение, указывается слева от оператора присваивания, а присваиваемое переменной значение справа от оператора присваивания. Значение, присваиваемое переменной, если речь идет о скалярных величинах, может быть числом или выражением, содержащим другие переменные. При этом необходимо, чтобы этим переменным ранее уже было присвоено значение. Пример использования скалярных переменных в пошаговых вычислениях приведен в рабочем документе на рисунке 3.

Рисунок 3

Первой командой x=0.5*sin(0.1) присваивается значение переменной «x». При этом использована встроенная функция Matlab «sin()» для вычисления синуса. Присвоенное в результате этой переменной значение отображается внизу под строкой ввода в формате:

«переменная =

значение»

Аналогично следующей командой y=0.3*cos(0.2) значение присваивается переменной «y». Здесь «cos()» - встроенная функция Matlab для вычисления косинуса. Обращаем также внимание читателя, что в качестве десятичного разделителя при вводе действительных чисел с дробной десятичной частью используется точка.

Наконец, командой z=(x^2+y^2)^(1/3) значение присваивается переменной «z». В выражение, определяющее значение переменной «z», входят переменные «x» и «y». Однако поскольку предварительно этим переменным были присвоены значения, ошибки не возникает и значение переменной «z» присваивается корректно.

Есть две базовые операции, которые достаточно полезны, особенно при большем объеме вычислений. Во-первых, в некоторых случаях нужно узнать, какие переменные рабочего пространства уже используются, и, во-вторых, иногда приходится, образно выражаясь, "удалять переменные с игрового поля" - то есть освобождать память, выделенную под эти переменные. Первая операция выполняется с помощью инструкции «whos». Если ввести в командную строку эту инструкцию и нажать клавишу «Enter», будет выведен список доступных в рабочем пространстве переменных с описанием их некоторых атрибутов.

Рисунок 4

В данном случае список состоит из четырех переменных: трех объявленных переменных пользователя «x», «y» и «z», и системной переменной «ans». Очистка пространства переменных осуществляется с помощью инструкции «clear», после которой, через пробел, указываются имена удаляемых переменных. На рисунке 5 представлен результат выполнения команды «clear x y», после которой выполнена команда «whos» для проверки списка переменных рабочего пространства.

Рисунок 5

Поскольку командой «clear x y» переменные «x» и «y» из рабочего пространства удалены, в списке переменных остались только переменная «z» и системная переменная «ans». Хотя значение переменной «z» присваивается на основе значений переменных «x» и «y», их удаление из рабочего пространства (или изменение их значения) назначение переменной «z» никак не влияет. Для удаления из рабочего пространства всех переменных используют инструкцию «clear» без указания переменных.

В предыдущих примерах использовались скалярные величины. С точки зрения основополагающей идеологии и технической реализации, скаляры в Matlab являются скорее экзотикой, чем обычным явлением. Дело в том, что в Matlab базовым типом данных являются матрицы (или массивы). В этом отношении скаляр "с точки зрения Matlab" (если можно так выразиться) является матрицей размера 1х Как известно, массивы можно индексировать, то есть для доступа к элементу массива указывается имя массива и его индекс (или индексы). Индексы указываются после имени матрицы (массива) в круглых скобках и разделяются запятыми. К скалярной переменной можно обращаться как по имени, так и указав индексы - в данном случае это (1,1). Пример обращения к скалярной величине в обычном режиме и с помощью пары единичных индексов показан на рисунке 6.

Командой «MyVar=10» переменной «MyVar» присваивается значение «10». Обращаться к переменной можно как по имени «MyVar», так и в режиме обращения к элементу матрицы «MyVar(1,1)». В обоих случаях в качестве результата возвращается значение скалярной переменной «MyVar».

Поскольку все переменные в Matlab априори рассматриваются как матрицы, никаких особых инструкций при объявлении матриц выполнять не нужно, за исключением того, что для матрицы необходимо задать значения ее элементов. Делается это достаточно просто. Список элементов матрицы заключается в квадратные скобки, списки значений элементов строки разделяются запятыми или пробелами, а списки значений разных столбцов разделяются точкой с запятой. Например, командой «A=» задается вектор-строка (матрица размеров 1х3) с элементами «1», «2» и «3» соответственно.

Рисунок 6

Командой «B=» задается вектор-столбец (матрица размеров 3х1) с элементами «4», «5» и «6». Наконец, командой «C=» задается матрица размерами 3х2 (3 строки и 2 столбца). Примеры выполнения этих команд приведены в документе на рисунке 7.

Рисунок 7

К элементам матрицы можно обращаться в обычном режиме, указав два индекса (номер строки и номер столбца, на пересечении которых находится элемент). Существует также способ обращения по обобщенному индексу . Обобщенный индекс элемента матрицы определяется как его порядковый номер, если отсчет начинать с верхнего левого элемента сверху вниз и от левого столбика к правому. Так, если матрица «X» имеет размеры «n» на «m», то к элементу с индексами «i» и «j» можно обратиться либо как «X(i,j)», либо как «X(n*(j-1)+i)». Хотя второй способ индексирования элементов может показаться несколько запутанным, он соответствует техническому способу индексации элементов матрицы в памяти, поэтому вычисления в таком случае выполняются быстрее. На рисунке 8 приведен фрагмент документа, в котором в различном режиме выполняется обращение к элементам матрицы «C», определенной ранее. В частности, командой «C(1)» получаем значение элемента «C(1,1)» (значение1). Инструкция «C(5)» является ссылкой на элемент «C(2,2)», значение которого равно «4».

Рисунок 8

2. Арифметические операции

Основные арифметические операторы Matlab позволяют выполнять операции не только со скалярными величинами, но и с матрицами. Более того, можно утверждать, что основная часть операторов ориентирована на выполнение матричных операций. перечислены основные арифметические операторы Matlab с кратким описанием результата их применения к операндам разного типа (если такие допустимы).

Таблица 1 Основные арифметические операторы Matlab.

Оператор

Описание

Оператор сложения. Оператор бинарный. Операндами могут быть как скалярные величины, так и матричные. Для двух скалярных операторов выполняется сложение. Для двух матричных операндов (матрицы одинаковых размеров) выполняется поэлементное сложение: результатом является матрица той же размерности, что и матрицы-операнды, а ее элементы равны сумме соответствующих элементов складываемых матриц. Если один операнд - скаляр, а другой - матрица, то результатом является матрица, каждый элемент которой равен сумме скаляра и соответствующего элемента матрицы-операнда.

Оператор вычитания. Бинарный оператор. Операндами могут быт скаляры, матрицы одинаковых размеров или матрица и скаляр. Для скаляров вычисляется разность. Для операндов-матриц вычисляется матрица, элементы которой равны разности соответствующих элементом матриц-операндов. Если один операнд - матрица, а другой - скаляр, то результатом является матрица, элементы которой вычисляются как разность соответствующего элемента матрицы-операнда и скаляра (с учетом порядка операндов). Можно вычитать скаляр из матрицы и матрицу из скаляра.

Оператор умножения. Бинарный оператор. Если операндами являются скаляры, вычисляется произведение скалярных величин. Для операндов-матриц вычисляется матричное произведение. Если один операнд - матрица, а другой - скаляр, результатом является матрица, элементы которой вычисляются как произведение соответствующего элемента матрицы-операнда и скаляра.

Оператор деления. Бинарный оператор. Если оба операнда - скаляры, то в качестве результата возвращается частное от деления скаляра на скаляр. Если первый операнд - матрица, а второй - скаляр, в качестве результата возвращается матрица, каждый элемент которой получается поэлементным делением матрицы-операнда на скаляр. В случае если оба операнда - квадратные матрицы одного ранга, в качестве результата возвращается произведение матрицы - первого операнда на матрицу, обратную к матрице - второму операнду.

Оператор возведения в степень. Бинарный оператор. Первым операндом может быть скаляр или квадратная матрица. Если первый операнд - скаляр, то второй может быть любым действительным скаляром. В качестве результата возвращается первый операнд, возведенный в степень, определяемую вторым операндом. Если первый операнд - квадратная матрица, то второй операнд должен быть целочисленным (может быть отрицательным). Результатом является матрица, вычисляемая возведением матрицы-операнда в целочисленную степень, определяемую вторым операндом.

Оператор левостороннего деления. Бинарный оператор. Операндами

являются квадратные матрицы одного ранга. Результатом является матрица, равная произведению матрицы, обратной к первому операнду-матрице, на второй операнд-матрицу.

Оператор поэлементного умножения. Бинарный оператор. Операндами являются матрицы одинакового размера. Результатом является матрица, элементы которой равны произведению соответствующих элементов матриц-операндов.

Оператор поэлементного деления. Бинарный оператор. Операндами являются матрицы одинакового размера. Результатом является матрица, элементы которой вычисляются как частное от деления элементов матрицы - первого аргумента на соответствующие элементы матрицы - второго аргумента.

Оператор поэлементного левостороннего деления. Бинарный оператор. Операндами являются матрицы одинакового размера. Результатом является матрица того же размера. Выполняется деление элементов матрицы - второго операнда на соответствующие элементы матрицы - первого операнда.

Оператор вычисления сопряженной матрицы. Унарный оператор. Результатом является матрица, сопряженная к матрице-оператору.

Оператор транспонирования. Унарный оператор. Результатом является матрица, транспонированная к матрице-операнду.

Оператор поэлементного возведения в степень. Бинарный оператор.

Операндами могут быть скаляры или матрицы (в разной комбинации). Если первый аргумент - матрица, а второй - скаляр или матрица той же размерности, то в качестве результата возвращается матрица, элементы которой получаются возведением элементов первой матрицы в степень, определяемую вторым операндом-скаляром или соответствующими элементами второго операнда-матрицы. Если первый операнд скалярный, а второй является матрицей, то результатом будет матрица того же размера, что матрица-операнд (второй). Элементы матрицы-результата получаются возведением скаляра (первый операнд) в степень, определяемую соответствующим элементом второго (матричного) операнда.

Приведенные операторы практически полностью перекрывают весь спектр возможных операций, которые приходится выполнять с матрицами. Некоторые примеры использования арифметических операторов с матричными операндами приведены в табл. 2. Матрицы «A» и «B» при этом инициализированы в документе следующими командами (жирным шрифтом выделен ввод пользователя):

>> A=

>> B=[-1,1;3,-2]

Таблица 2 Примеры выполнения арифметических операций с матрицами.

Описание

Произведение матриц.

Вычисляется по правилам вычисления матриц в линейной алгебре.

Деление матриц.

Матрица A умножается на матрицу, обратную к матрице B.

Левостороннее умножение матриц.

Матрица, обратная к матрице A, умножается на матрицу B.

Поэлементное деление матриц.

Элементы матрицы A делятся на соответствующие элементы матрицы B.

Левостороннее поэлементное деление.

Элементы матрицы B делятся на соответствующие элементы матрицы A.

Поэлементное умножение матриц.

Элементы матрицы A умножаются на соответствующие элементы матрицы B.

Сумма матриц.

Вычисляется по правилам вычисления суммы матриц в линейной алгебре (складываются соответствующие элементы матриц A и B).

Разность матриц.

Вычисляется по правилам расчета разности двух матриц (от элементов матрицы A вычитаются соответствующие элементы матрицы B).

Транспонирование матрицы.

Результатом является матрица, транспонированная к матрице A.

Рисунок 9

Рисунок 10

Однако арифметические операторы далеко не единственные операторы, используемые при вычислениях.

3. Логические операторы и операторы сравнения

Важную группу операторов составляют логические операторы и операторы сравнения. Операндами в этом случае могут быть как скаляры, так и матрицы. Прежде, чем приступить к рассмотрению этих операторов, отметим некоторые особенности работы с логическими значениями.

Обычно под логическими значениями подразумевают тип данных, переменные которого могут принимать два значения - истина и ложь («true» и «false» соответственно). В Matlab любое числовое значение, отличное от нуля, интерпретируется как истина (или «true»), а ненулевые значения интерпретируются как ложь (или «false»). Фактически, это есть правило перевода числовых значений в логические значения. Обратное преобразование выполняется по следующему правилу: логическое значение истина (или «true») преобразуется в числовое значение «1», а логическое значение ложь (или «false») преобразуется в числовое значение «0».

Если некоторой переменной присвоить в качестве значения «true» или «false», отображаемым будет соответственно значение «1» или «0».

Операндами для операторов сравнения выступают числовые значения. Это бинарные операторы. Если оба операнда - скаляры, сравнение выполняется по правилам сравнения чисел. При истинном соотношении возвращается значение «1», при ложном - значение «0». Если операндами являются матрицы одинаковых рангов, сравниваются соответствующие элементы матриц (по правилам сравнения числовых значений). Результатом является "логическая матрица": ее элементы равны 1 или 0 в зависимости от результата сравнения соответствующих элементов исходных матриц. Если одним операндом является скаляр, а другим - матрица, то выполняется сравнение каждого элемента матрицы со скаляром. Операторы сравнения перечислены в таблице 3. бинарный программирование компилирование

Таблица 3 Операторы сравнения Matlab.

Оператор

Описание

Оператор проверки на предмет равенства.

Оператор проверки значений операндов на предмет неравенства.

Оператор проверки того, что значение первого операнда больше значения второго операнда.

Оператор проверки того, что значение первого операнда меньше значения второго операнда.

Оператор проверки того, что значение первого операнда не меньше значения второго операнда.

Оператор проверки того, что значение первого операнда не больше значения второго операнда.

Как и в случае операторов сравнения, операндами логических операторов могут выступать как скаляры, так и матрица (одновременно оба или только один). Если операндами являются скаляры, соответствующие логические операции выполняются по описанным выше правилам преобразования числовых и логических значений. Если оба операнда - матрицы одинаковых размеров, логические операции выполняются поэлементно. При условии, что один операнд - матрица, а второй - скаляр, логическая операция выполняется для каждого элемента матрицы и скаляра. Логические операторы Matlab представлены в таблице 4.

Таблица 4 Логические операторы Matlab.

Как в операциях сравнения, так и в логических операциях для элементов матриц или скаляров (в зависимости от типа операндов) возвращаются значения «0» (ложь) и «1» (истина).

4. Комплексные числа

В Matlab можно использовать не только действительные, но и комплексные числа. Ввод комплексных чисел в рабочей области выполняется в соответствии с правилами представления комплексных чисел. В качестве мнимой единицы можно использовать, на выбор, переменные «i» или «j», без какого бы то ни было предварительного объявления. Однако если переменной «i» или «j» присвоить числовое значение, соответствующую переменную в качестве мнимой единицы задействовать не получится.

>> z=1+2i

>> z+j

>> (2-4i)*(1+z)

12.0000 - 4.0000i

>> i * z

При вводе комплексного значения между мнимой частью и мнимой единицей оператор умножения можно не ставить. По умолчанию для отображения мнимой единицы используется символ «i» (хотя может вводиться как «j»). Существует ряд функций, облегчающих работу с комплексными числами. Среди них имеет смысл выделить функции «real()» и «imag()» для вычисления действительной и мнимой частей комплексного числа соответственно, функцию «conj()» для вычисления комплексно сопряженного числа, а также функцию «complex()», принимающую два аргумента (действительная и мнимая части), на основании которых создается комплексное число.

>> complex(3,-2)

3.0000 - 2.0000i

>> conj(ans)

3.0000 + 2.0000i

>> real(ans)

>> imag (2-4 i )

Комплексными могут быть не только скалярные величины, но и матрицы.

Рисунок 11

5. Оператор создания интервала значений

Достаточно популярным и часто используемым в Matlab является оператор "двоеточие", то есть «:». Существует несколько вариантов его использования. Рассмотрим самые общие. Для создания вектора-строки со значениями, равно распределенными в некотором интервале, оператор используют в следующем формате: «нижняя граница диапазона, оператор (то есть «:») и верхняя граница диапазона» - например: «x=a:b». При этом создается вектор-строка (для приведенной команды вектор записывается в переменную «x»). Первый элемент вектора равен нижней границе указанного диапазона (значение «a»). Шаг дискретности изменения значений элементов вектора равен единице. Значение последнего элемента определяется верхней границей указанного диапазона (в данном случае «b»). Так, командой «x=1:10» создается вектор-строка со значениями «1, 2, 3 и т.д. до 10» включительно (жирным шрифтом выделен ввод пользователя):

>> x=1:10

1 2 3 4 5 6 7 8 9 10

Рисунок 12

Если нужно создать вектор-строку с последовательностью значений и шагом дискретности, отличным от единицы, используют тот же оператор "двоеточие" (то есть «:»), но в несколько ином формате: «указывается нижняя граница диапазона значений, оператор "двоеточие", шаг дискретности, снова оператор "двоеточие", и верхняя граница диапазона» - например: «y=a:m:b». Формируется вектор-строка с первым значением - нижней границей диапазона (для приведенной команды это «a»). Каждый следующий элемент получается прибавлением к предыдущему величины, указанной в качеств шага дискретности (в данном случае «m»). Значения элементов сформированного массива не превышают верхнюю границу диапазона (то есть «b»). Пример такого использования оператора "двоеточие" приведен ниже (отрывок кода из рабочей области, жирным выделен ввод пользователя):

>> y=1:0.7:10

Columns 1 through 8

0000 7000 2.4000 3.1000 3.8000 4.5000 5.2000 5.9000

Columns 9 through 13

6.6000 7.3000 8.0000 8.7000 9.4000

Рисунок 13

В данном случае создается вектор-строка y со значениями от 1 до 10 с шагом дискретности 0.7 - значения 0, 7, 2.4 и т.д. до 9.4 включительно (следующее гипотетическое значение в последовательности 10.1 превышает верхнюю границу диапазона 10, поэтому в формируемый вектор оно не входит). Сообщения «Columns 1 through 8» и «Columns 9 through 13» появляются автоматически как следствие того, что результат выполнения команды «y=1:0.7:10» в одну строку не помещается, поэтому выполняется перенос части вектора-результата в следующую строку. Данные сообщения призваны облегчить процесс индексной идентификации элементов.

Второй способ использования оператора "двоеточие" - при индексировании элементов. Как и в предыдущем случае, существует несколько форматов, или правил, использования оператора "двоеточие" в индексах.

Например, если оператор "двоеточие" используется в формате «A(i:j,k)»,

то в качестве результата возвращается вектор-столбец, который формируется из элементов матрицы «A», находящихся в «k-м» столбце с «i-й» по «j-ю» строку включительно. Ссылка в формате «A(:,k)» возвращает в качестве значения весь «k-й» столбец матрицы «A».

Можно использовать оператор "двоеточие" при указании сразу двух индексов. Например, командой «A(i:j,m:n)» возвращается подматрица, состоящая их строк с «i-й» по «j-ю» и одновременно столбцов с «m-го» по «n-й».

Рассмотрим некоторые примеры использования оператора "двоеточие".

В частности, исходная матрица «A» вводится командой:

A=

В следующих командах оператор "двоеточие" используется для извлечения подматриц из исходной матрицы «A»:

>> A(1:3,2)

>> A(3,2:4)

>> A(3:4,1:2)

Например, командой «A(1:3,2)» возвращается вектор-столбец, составленный из элементов с первой по третью строку во втором столбце матрицы «A». Командой «A(3,2:4)» возвращается вектор-строка, который составлен из элементов третьей строки со второго по четвертый столбец включительно матрицы «A». Наконец, командой «A(3:4,1:2)» возвращается подматрица матрицы «A», верхний левый элемент которой имеет индексы «(3,1)», а правый нижний элемент имеет индексы «(4,2)».

6. Встроенные математические функции

В Matlab по умолчанию доступно достаточно большое количество встроенных функций. Ядро их составляют математические функции, которые на практике используются сравнительно часто. Некоторые из них перечислены в таблице 5.

Таблица 5 Некоторые математические функции Matlab.

Описание

Модуль числа (в том числе и комплексного), указанного аргументом функции.

Арккосинус для числа, указанного аргументом функции.

Арккосинус аргумента функции. Результат представлен в градусах.

Арккотангенс числа, указанного аргументом функции.

Арккотангенс аргумента функции. Результат представлен в градусах.

Арккосеканс числа, указанного аргументом функции.

Арккосеканс аргумента функции. Результат представлен в градусах.

Арксеканс числа, указанного аргументом функции.

Арксеканс аргумента функции. Результат представлен в градусах.

Арксеканс гиперболический от числа, указанного аргументом функции.

Арксинус от числа, указанного аргументом функции.

Арксинус аргумента функции. Результат представлен в градусах.

Арксинус гиперболический от числа, указанного аргументом функции.

Арктангенс от числа, переданного аргументом функции.

У функции два аргумента (например, atan(y,x)). В качестве результата возвращается направление (угол в диапазоне значений от -р до р) на точку с соответствующими координатами (в данном случае, точка с координатами (y,x)). Если аргументы комплексные, их мнимые части игнорируются.

Арктангенс аргумента функции. Результат представлен в градусах.

Арктангенс гиперболический от числа, переданного аргументом функции.

Функция округления аргумента в направлении плюс бесконечности - округление выполняется до целого значения, которое не меньше, чем аргумент.

Косинус от числа, переданного аргументом функции.

Косинус аргумента функции, указанного в градусах.

Косинус гиперболический от числа, переданного аргументом функции.

Котангенс от числа, переданного аргументом функции.

Котангенс аргумента функции, указанного в градусах.

Котангенс гиперболический от числа, переданного аргументом функции.

Косеканс от числа, переданного аргументом функции.

Косеканс аргумента функции, указанного в градусах

Косеканс гиперболический от числа, переданного аргументом функции.

Экспонента: показательная функция с основанием-константой Эйлера и показателем степени, определяемым аргументом функции.

Командой вида expm1(x) с повышенной точностью вычисляется значение exp(x)-

Функцией возвращается вектор-строка с простыми множителями числа (с учетом их кратности), указанного аргументом функции.

Функция для вычисления факториала числа, указанного аргументом функции.

Функция округления в направлении нуля. Результатом является число, получающееся округлением аргумента функции до ближайшего целого значения в направлении нуля.

Функция округления аргумента до ближайшего целого значения, которое не превышает аргумент, - округление в направлении минус бесконечности.

Функцией возвращается наибольший общий делитель целых чисел или целочисленных массивов - аргументов функции.

Корень квадратный из суммы квадратов модулей аргументов, переданных функции.

У функции два аргумента. Результатом является целая часть отделения первого аргумента на второй. Можно также указать опцию - в одинарных скобках имя функции, с помощью которой выполняется округление.

Функцией в качестве результата возвращается наименьшее общее кратное для целых чисел или целочисленных массивов - аргументов функции.

Натуральный логарифм от числа, указанного аргументом функции.

Логарифм по основанию 10 от числа, указанного аргументом функции.

Командой вида log1p(x) с повышенной точностью вычисляется значение log(1+x).

Логарифм по основанию 2 от числа, указанного аргументом функции.

Функцией возвращается остаток от деления значения первого аргумента функции на значение второго аргумента. Целая часть отделения определяется функцией froor().

Функцией в качестве значения возвращаются биномиальные коэффициенты. Если функция вызвана в формате nchoosek (n,k), то в качестве результата возвращается значение: ,

Функцией в качестве значения возвращается ближайшее целое число - степень двойки, которое не меньше модуля аргумента функции.

Командой nthroot(x,n) в качестве значения возвращается корень порядка n (второй аргумент) из действительного числа или элементов действительного массива x (первый аргумент).

Функция может вызываться с одним или двумя аргументами. Если у функции один аргумент (массив) и функция вызывается в формате pow2(x), то в качестве результата возвращается массив степеней двойки, показатели степени определяются массивом x. Если функция вызывается с двумя аргументами в формате pow2 (x,y), то результатом является x.*2.^y.

У функции два аргумента. Если аргументы скалярные, в качестве результата возвращается значение первого аргумента, возведенное в степень, определяемую вторым аргументом. В более общем случае в качестве результата выполнения команды power (A,B) возвращается "A.^B".

Функцией генерируется список простых чисел. Количество чисел указывается аргументом функции.

Функцией возвращается остаток от деления значения первого аргумента функции на значение второго аргумента. Целая часть отделения определяется функцией fix().

Функция округления аргумента до ближайшего целого значения.

Секанс от числа, указанного аргументом функции.

Секанс аргумента функции, указанного в градусах.

Знак числа, указанного аргументом функции (для положительных чисел - единица, для отрицательных чисел - минус единица, для нуля - ноль).

Синус от числа, указанного аргументом функции.

Синус аргумента функции, указанного в градусах.

Корень квадратный из числа, указанного аргументом функции.

Описание

Тангенс от числа, указанного аргументом функции.

Тангенс аргумента функции, указанного в градусах.

Хотя большинство из представленных выше функций с математической точки зрения определены для скалярных величин, обычно они могут применяться и для аргументов-матриц. В этом случае действие функционального оператора применяется к каждому из элементов матрицы. Например, если переменная «A» является матрицей с элементами «A(i,j)», то в результате выполнения команды «exp(A)» получим матрицу того же ранга, а ее элементы вычисляются как «exp(A(i,j))». В некоторых случаях такой подход неприемлем. Существуют так называемые матричные функции, аргументами которых по определению являются матрицы (в основном квадратные). Результат этих функций вычисляется по алгоритмам, разработанным специально для матриц. Так, в Matlab есть встроенные матричные функции для экспоненты, логарифма и квадратного корня. Это соответственно функции «expm()», «logm()» и «sqrtm()». Например, если «A» - квадратная матрица, то функцией «expm(A)» вычисляется матричная экспонента. По определению это ряд:

Результатом является матрица, которая вычисляется, как правило, на основе собственных чисел и собственных векторов матрицы «A». Матричный логарифм для аргумента-матрицы «A», вычисляемый инструкцией «logm(A)», представляет собой матрицу такую, что матричная экспонента от нее равна матрице «A». Другими словами, по определению если «B=logm(A)», то «expm(B)=A», и функция «logm()» является обратной к функции «expm()». Аналогично, в результате извлечения квадратного корня из матрицы «A» с помощью функции «sqrtm()» получаем матрицу, которая, будучи возведенной в квадрат, дает матрицу «A». Например, если «B=sqrtm(A)», то «B*B=A».

В Matlab также широко представлены специальные функции, некоторые их них приведены в таблице 6.

Таблица 6. Некоторые специальные математические функции Matlab.

Описание

Функция Эйри.

Функция Бесселя третьего рода (функция Ханкеля).

Командой besseli(n,x) возвращается модифицированная функция Бесселя первого рода (индекса n).

Командой besselj(n,x) возвращается функция Бесселя первого рода (индекса n), которая является одним из решений уравнения Бесселя.

Командой besselk(n,x) возвращается модифицированная функция Бесселя второго рода (индекса n), которая является одним из решений модифицированного уравнения Бесселя. Для целых индексов соответствующее выражение рассчитывается как лимит.

Командой besselj(n,x) возвращается функция Бесселя второго рода (индекса n), которая является одним из решений уравнения Бесселя. Для целых индексов соответствующее выражение рассчитывается как лимит.

Бета-функция Эйлера.

Неполная бета-функция Эйлера.

Логарифм натуральный от бета-функции Эйлера. Аргументами передаются аргументы бета-функции.

Эллиптическая функция Якоби. Если функция вызывается с двумя аргументами в формате ellipj(u,m), в качестве результата возвращаются значения (вектор) для функций sn (u ) , cn (u ) и dn (u ).

Функция для вычисления полного эллиптического интеграла первого и второго рода (вектор значений).

Функция ошибок.

Функция ошибок (остаточная).

Функция ошибок (остаточная нормированная).

Обратная функция к функции ошибок erf().

Обратная функция к функции ошибок erfc().

Интегральная экспонента.

Гамма-функция Эйлера.

Неполная гамма-функция.

Логарифм натуральный от гамма-функции Эйлера. Аргументом функции передается аргумент гамма-функции.

Функция для вычисления присоединенных полиномов Лежандра. В результате вызова функции в формате legendre(n,x) возвращается вектор-столбец значений присоединенных полиномов Лежандра m () Pn x для m = 0,1,2,...,n

Пси-полигамная функция.

Как и в случае с базовыми математическими функциями, для большинства специальных функций аргументами могут указываться матрицы. В этом случае функция вычисляется для каждого из элементов матрицы.

7. Формат вывода числовых данных

В некоторых случаях приходится изменять способ, которым данные с результатом выполнения команд пользователя выводятся на экран. В первую очередь отметим, что можно вообще не отображать результат выполнения команды в командном окне. Для этого достаточно соответствующую команду закончить точкой с запятой (то есть «;»). В этом случае после нажатия клавиши «Enter» команда выполняется, но результат ее выполнения в командном окне не отображается. Такой режим особенно удобен в тех случаях, когда нужно выполнять громоздкие промежуточные расчеты, которые, с одной стороны, необходимы для получения конечного результата, а с другой - загромождают рабочее пространство. Поэтому разумный выход из такой ситуации - скрыть результат выполнения команды. Числовой формат вывода в явном виде задается с помощью инструкции «format». В команде определения формата вывода после ключевого слова «format» указывается применяемый формат. Допустимые форматы, с кратким их описанием, перечислены в таблице 7.

Таблица 7 Числовые форматы.

Описание

Формат отображения числовых данных, при котором после десятичной точки отображается четыре цифры (формат данных с фиксированной точкой). Формат используется по умолчанию.

Числовой формат, при котором после десятичной точки отображается 7, 14 и 15 цифр в зависимости от типа числовых данных (формат данных с фиксированной точкой).

Формат отображения числовых данных с мантиссой и показателем степени (формат данных с плавающей точкой), при котором после десятичной точки отображается четыре цифры.

Числовой формат отображения с мантиссой и показателем степени (формат данных с плавающей точкой), при котором после десятичной точки отображается 7, 14 и 15 цифр в зависимости от типа числовых данных.

В зависимости от значения, для отображения применяется либо формат с плавающей точкой, либо с фиксированной точкой. После десятичной запятой отображается четыре цифры.

В зависимости от значения, для отображения применяется либо формат с плавающей точкой, либо с фиксированной точкой. После десятичной запятой отображается 7, 14 или 15 цифр.

Инженерный формат с четырьмя отображаемыми цифрами после десятичной точки и показателем степени, кратным трем.

Инженерный формат с 7, 14 или 15 отображаемыми цифрами после десятичной точки и показателем степени, кратным трем.

Формат, при котором для положительных чисел отображается знак +, для отрицательных отображается знак -, а для нуля отображается пробел.

Финансовый формат, при котором после десятичной точки отображается две цифры.

Отображение чисел в шестнадцатеричной системе счисления.

Отображение чисел в виде рациональной дроби.

Режим отображения результатов вычислений в компактной форме, с уменьшенными интервалами между строками.

Режим отображения результатов вычислений с увеличенными интервалами между строками. Используется по умолчанию.

Ниже приведен пример отображения числа р в разных форматах (в командах использована встроенная константа «Matlab pi»):

>> pi

>> format long

>> pi

3.141592653589793

>> format long e

>> pi

3.141592653589793e+000

>> format long eng

>> pi

3.14159265358979e+000

>> format bank

>> pi

>> format rat

>> pi

>> format +

>> pi

Рисунок 14

Настройки формата вывода влияют только на способ отображения числовых значений, но никак не точность их представления. Поэтому главным критерием при выборе способа вывода данных может быть вопрос удобства. Есть одна функция, которая хотя напрямую и не относится к определению формата вывода числовых данных, ее использование значительно облегчает процесс взаимодействия пользователя с системой. Это функция «clc», которая позволяет очистить рабочее пространство от команд ввода и результатов их выполнения.

Практическая часть

1. Создать вектор-строку: начальный элемент равен - р, конечный р, шаг равен 0. Транспонировать строку в столбец.

2. Создать три вектор-строки из 5 элементов fi = , где n = 5 для х = 2, 3, 4. Объединить эти строки в матрицу А (3 Ч 5).

3.Создать три вектор-столбца из 5 элементов арифметической прогрессии. Элемент арифметической прогрессии рассчитывается по формуле:

где «аn-1» - предыдущий элемент; «аn» - последующий.

Пять элементов вектора формируются, начиная с задания первого элемента «а» и c использованием шага арифметической прогрессии «d» для задания последующих элементов:

Для первого вектор-столбца: a = 2; d = 1:

Для второго вектор-столбца: a = 7; d = 2:

Для третьего вектор-столбца: a = 10; d =-2:

4. Объединить эти вектор-столбцы в матрицу В (5 Ч 3).

5. Транспонировать матрицу В и объединить с матрицей А в матрицу М(6 Ч 5).

6. Из матрицы A убрать вторую строку.

7. У матрицы В обнулить третью строку и убрать две последние строки.

8. Создать матрицу Н(2 Ч 2) путем выделения первых двух строк и столбцов матрицы М.

9. Создать с помощью функции repmat матрицу, состоящую из 2 Ч 3 матриц Н.

10. Создать матрицы размерностью 3 Ч 3:

C - единиц:

F - равномерно распределенных случайных чисел:

E - нормально-распределенных случайных чисел:

11. Найти минимальный элемент в матрице равномерно-распределенных чисел размерностью 3 Ч 5, используя функцию «reshape».

1. Построить на отрезке [-1,-0.3]с шагом 0.005 графики огибающих функций.

Первый график вывеси красной сплошной линией, а второй - зеленой штрих-пунктирной линией с маркерными точками х. Затем на полученные графики наложить графики дискретных отсчетов этих же функций без затирания предыдущего результата.

2. Построить графики суточных температур; значения векторов времени и температуры за два дня приведены ниже.

Время - 0 4 7 9 10 11 12 13 13.5 14 14.5 15 16 17 18 20 22.

Температура 10 мая - 14 15 14 16 18 17 20 22 24 28 25 20 16 13 13 14 13. Температура 11 мая - 12 13 13 14 16 18 20 20 25 25 25 20 16 12 12 11 10.

Оформить графики заголовком "All temperature", по оси «Х» подписать "Time"; по оси «У» `Temperature"; в легенде - "10 may", "11 may" и разместить ее в нижнем левом углу.

3.Построить 3-хмерные графики функции:

z (x ,y ) = 4 sin(2рx ) cos(5рy )(1 - x 2 )y (1 ?y )

на прямоугольной области «x [?1], y » с шагом 0.05 всеми способами, рассмотренными в лабораторной работе, размещая их в отдельных областях на одном окне. Названия функций, применяемых для построения графиков, включить в заголовки этих графиков.

Размещено на Allbest.ru

...

Имена изменены, все совпадения случайны.

Увертюра

Сразу оговорюсь, MATLAB - отличный инструмент. Отличный инструмент, который мы использовали не по назначению.

Взгляните на нашу компанию. Наша сфера деятельности - разработка ПО для промышленности и много чего еще. В компании работает около 100 человек, а я в этой компании - один из сотрудников, занимающийся разработкой алгоритмов. Есть у нас и Флагманский продукт, приносящий основную прибыль.

Флагманский продукт - бизнес-приложение. В нем много формочек и отчетиков, своя база данных и вычислительное ядро. Вычислительное ядро написано на C# без привлечения нативного кода. Такое решение было принято разработчиками осознанно. Parallel.For был так соблазнителен, а C++ все хотели забыть как страшный сон.



Реальность, как это нередко бывает, не прислушалась к нашим пожеланиям, и скорости C# вскоре стало не хватать. Другая проблема, что, как выяснилось, программисты, какой бы хороший код не писали, в линейной алгебре разбираются слабо.

Тогда наш Главный Алгоритмист предложил идею. Описание этой идеи и того, что из нее вышло и составляет суть данной статьи.

Идея

Идея была проста. Вместо того, чтобы платить зарплату одному умному программисту (который бы умел писать хороший код на C# и разбирался в тонкостях нашего «матана», а такого непросто найти), можно взять двух «полуумных». Первый будет писать прототипы на MATLAB, второй - переносить решение на C#.
MATLAB в таком случае преподносился как инструмент для документирования алгоритма. У такого решения были озвучены следующие преимущества:

  • MATLAB - простой язык, который опытный программист может выучить за 1 день
  • Все математики пишут на MATLAB

Стоит отметить, что ранее для документирования алгоритма использовался Mathcad, UML-диаграммы и даже просто лист бумаги.

С идеей спорили, ее не принимали. Но в итоге Главный Алгоритмист всех убедил, и была создана команда алгоритмистов, пишущих на матлабе. В эту команду вошел и я. В нашу команду также вошел Один Программист из числа разработчиков, который должен был бы, не думая, переносить наши матлаб-экзерсисы на C#.

Замечу, что кроме предложений отказаться от этой затеи, было и предложение использовать, по крайней мере, python+numpy. Хотя бы той причине, что сколько-нибудь значительного опыта разработки на MATLAB ни у кого не было (я раньше писал на python и R, остальные были математики и инженеры, использующие MATLAB как продвинутый калькулятор). Предложения, как можно понять, отклонили.

Прошел год...

Прошел год и сейчас уже можно подвести некоторые итоги:

  • Математики не умеют писать код. А в той лапше, что выходит из-под их пера не могут разобраться и они сами. Нет ни специфических знаний, ни опыта, ни культуры программирования
  • Раз уж мы отказались от схем и Mathcad, то появилось желание использовать для наших MATLAB программ реальные источники данных. В итоге мы немало времени занимались дублированием части функционала Флагманского продукта на Матлабе
  • Пока мы занимались программированием, времени на работу над собственно алгоритмом оставалось немного
  • MATLAB не подходит для разработки больших программ. По крайней мере, не подходит нам. Динамическая нестрогая типизация, медленные циклы, ооочень-медленный ООП (настолько, что пришлось частично отказаться от использования ООП), неполная поддержка разреженных матриц
  • Переносить код с MATLAB на C# непросто. Еще сложнее бэкпортировать рефакторинги и оптимизации
В результате мы не можем заранее оценить, сколько времени потребуется на реализацию той или иной фичи. Неделя или может быть месяц?

Вместо заключения

В самом начале статьи я немного слукавил, т.к. история продолжается до сих пор. Мы продолжаем писать на MATLAB, наш код продолжают переносить на C#. Хотя теперь уже все согласны, что у идеи Главного Алгоритмиста есть изъяны. Но менять уже что-либо слишком поздно.

А тем временем начинают поговаривать о дополнительном перекодировании решений с MATLAB уже на С++…

MATLAB сочетает в себе простой в освоении язык с высокой скоростью расчетов. Благодаря чему достигается такое быстродействие? Что нужно сделать, чтобы написать на MATLAB по-настоящему быструю программу? Наконец, существует ли достойная альтернатива MATLABу среди свободного программного обеспечения? На все эти вопросы мы и постараемся сейчас ответить.

MATLAB появился в конце 1970-х как скриптовый язык и обертка над функциями библиотек линейной алгебры LINPACK и EISPACK. Особенностью MATLAB является то, что базовый (а в ту пору - единственный) тип данных в нем - матрица, а не число. Благодаря этому удалось избавить запись матричных операций от циклов, сделав ее более компактной и похожей на математическую. С другой стороны, использование самых современных на тот момент библиотек обеспечивало высокое быстродействие расчетов. Все это способствовало быстрому росту популярности MATLAB.

Умножение матрицы на число, записанное разными способами

С тех пор прошло более тридцати лет. За эти годы о MATLAB были написаны десятки книг, он сделался одним из стандартных языков для научно-технических расчетов. Относительная простота языка и высокая скорость выполняемых с его помощью вычислений сохранились и по-прежнему остаются привлекательными сторонами пакета. Но за счет чего это достигается? Как устроен современный MATLAB?

Как и прежде, у MATLAB «под капотом» самые современные математические библиотеки. Сейчас это: Intel Math Kernel Library (MKL) для операций линейной алгебры и Intel Integrated Performance Primitives Library (IPPL) - для оптимизации обработки изображений . MKL включает в себя, в частности, библиотеки: BLAS , реализующую базовые векторно-матричные операции, и LAPACK - современное развитие LINPACK - содержащую решатели задач линейной алгебры. Поэтому неудивительно, что по скорости выполнения MATLAB обгоняет любой «самодельный» код, реализующий векторно-матричные операции. Также уверенно обходит он и пакеты, использующие другие реализации BLAS и LAPACK.

Дело в том, что MKL и IPPL используют SSE и AVX - наборы инструкций для процессора, которые реализуют параллельные вычисления, в случае, когда нужно выполнить одну и ту же последовательность действий над разными данными (SIMD). Это приводит к существенному росту производительности, причем без каких-либо усилий со стороны пользователя.

Кроме того, MATLAB, вероятно, использует SSE/AVX и в функциях своего ядра, которые реализованы на С. По крайней мере, для разработки пакета MathWorks использует Intel Parallel Studio XE , в состав которого входит компилятор C/C++.

Любопытно, что на компьютерах с процессорами AMD MATLAB также использует библиотеки, разработанные в Intel, хотя AMD реализовало свою библиотеку со сходными возможностями - AMD Core Math Library (ACML).

Таким образом, быстродействие MATLAB складывается из высокооптимизированных библиотек (Intel), неявной параллелизации (что также является заслугой Intel) и настроенных на использование этих преимуществ функций ядра (MathWorks). Мы не можем знать точно степень влияния каждого из факторов, кроме того они могут меняться от версии к версии и от платформы к платформе.

Определение версий используемых MATLAB библиотек с помощью функции version

Для того чтобы эффективно использовать эти возможности, нужно «векторизовать» программу, т. е. заменить использование циклов операциями над массивом в целом, которые как раз и реализуются быстрыми функциями MATLAB.

Но и циклы не были забыты. В 2003 г. в составе MATLAB (версии 6.5, R13) появился JIT-компилятор . Он анализирует выполняемую программу, транслируя повторяющиеся фрагменты в машинный код. В результате, при последующих повторениях скорость выполнения этих фрагментов значительно возрастает (иногда - до 100 раз), что позволяет сделать некоторые циклы почти столь же быстрыми, как их векторизованные аналоги. Но: для того, чтобы JIT-компилятор можно было успешно применить, код цикла должен удовлетворять определенным требованиям.

Краткую сводку этих требований, а также советов по векторизации программы, можно получить в работе Writing Fast MATLAB Code , а более детальную и свежую информацию - в блоге Undocumented Matlab Яира Альтмана или на страницах его книги “Accelerating MATLAB Performance” - наиболее подробному на сегодняшний день руководству по оптимизации программ MATLAB. Кстати, приведенное выше использование функции version также относится к недокументированным возможностям пакета.

В качестве более дешевой альтернативы MATLABу можно использовать Python c библиотеками NumPy/SciPy и установленной MKL . При этом вместо JIT-компилятора MATLAB применяются Numba или Cython . Многочисленные тесты, результаты которых можно найти в Интернет (например, этот), говорят о том, что MATLAB и связка Python + SciPy выдают весьма близкие по быстродействию результаты, так что на первый план выступают умение программиста и его знание особенностей конкретного пакета.

Дмитрий Храмов

просмотров