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

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

Давайте узнаем о программировании в MATLAB на примере набора данных MATLAB. Данные взяты из исследования марок и типов попкорна (Hogg 1987). Столбцы матрицы представляют собой бренды ядер попкорна, Gourmet, National и Generic соответственно. Первые три ряда соответствуют партиям с использованием масляного поппера, а последние три ряда соответствуют партиям с использованием воздушного поппера. Значения отклика — это выход попкорна в чашках.

Мы можем загрузить данные в панели Command Window рабочего стола MATLAB.

load 'popcorn'; popcorn
popcorn = 5.5 4.5 3.5 5.5 4.5 4 6 4 3 6.5 5 4 7 5 5 7 5 4.5

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

popcorn(:,1)./popcorn(:,2)
ans = 1.22 1.22 1.5 1.3 1.27 1.4

Чтобы узнать больше об общем синтаксисе MATLAB и его функциональности, обратитесь к таблице ниже или этому подробному руководству.

Далее давайте узнаем об индексации выходных данных и функций. В MATLAB начальный элемент массива имеет индекс 1, в отличие от Python, где начальный элемент имеет индекс 0.

M ATLAB использует индексацию N-D или предоставление определенного значения индекса для каждого измерения массива (например, номера строки и номера столбца). Важно отметить, что индексы в Python являются включающими слева и исключающими справа, но MATLAB включает в себя оба конца.

popcorn
popcorn = 5.5 4.5 3.5 5.5 4.5 4 6 4 3 6.5 5 4 7 5 5 7 5 4.5
popcorn(4:end,:)
ans = 6.5 5 4 7 5.5 5 7 5 4.5
popcorn(:,[1 3])
ans = 5.5 3.5 5.5 4 6 3 6.5 4 7 5 7 4.5

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

popcorn(9)
ans = 4
popcorn(popcorn>6)
ans = 6.5 7 7

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

popcorn(1,4) = 0
popcorn = 5.5 4.5 3.5 0 5.5 4.5 4 0 6 4 3 0 6.5 5 4 0 7 5.5 5 0 7 5 4.5 0

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

popcorn(:,4) = [];

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

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

brandAvg = mean(popcorn)
brandAvg = 6.25 4.75 4

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

function [firstHalfAvg, secondHalfAvg] = popperTypeAvg(data) rows1to3 = mean(data(1:3,:),'all') rows4to6 = mean(data(4:6,:),'all') end
[oilAvg,airAvg] = popperTypeAvg(popcorn)
oilAvg = 4.5 airAvg = 5.5

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

bar(popcorn,'BarWidth',.75) brandNames = ["Gourmet","National","Generic"]; legend(brandNames,'Location','bestoutside') title('Popcorn Yield') xlabel('Batch Number') ylabel('Cups of Popped Popcorn')

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

tiledlayout(1,size(popcorn,2)) for i = 1:size(popcorn,2) nexttile bar(popcorn(:,i)) title(brandNames(i)) xlabel('Batch Number') ylabel('Cups of Popped Popcorn') end

whos 'popcorn'
Name Size Bytes Class Attributes popcorn 6x3 144 double

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

brandNames = ["Gourmet","National","Generic"]; array2table(popcorn,'VariableNames',brandNames)
ans = 6x3table Gourmet National Generic _______ ________ ________ 5.5 4.5 3.5 5.5 4.5 4 6 4 3 6.5 5 4 7 5.5 5 7 5 4.5

В MATLAB может иметь значение «0» для false или «1» для true. Давайте исследуем это поведение, используя логическую индексацию и условный оператор, чтобы определить, произвели ли ядра марки Gourmet самую большую среднюю партию.

brandAvg = mean(popcorn) (brandAvg(1)>brandAvg(2))&&(brandAvg(1)>brandAvg(3))
brandAvg = 6.25 4.75 4 ans = logical 1

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

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

bestBrand = zeros(6,1); bestBrand = categorical(bestBrand); for i = 1:6 if popcorn(i,1) == max(popcorn(i,:)) bestBrand(i) = 'Gourmet'; end if popcorn(i,2) == max(popcorn(i,:)) bestBrand(i) = 'National'; end if popcorn(i,3) == max(popcorn(i,:)) bestBrand(i) = 'Generic'; end end bestBrand
bestBrand = 6x1categorical array Gourmet Gourmet Gourmet Gourmet Gourmet Gourmet

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

M ATLAB часто не требует написания циклов, так как он векторизован. MATLAB оптимизирован для матричных и векторных операций, поэтому написание векторизованного кода может улучшить читаемость кода, скорость и объем памяти. Мы можем векторизовать наш цикл, вызывая весь массив, а не по одной строке за раз. Функция возвращает несколько выходных данных, поэтому мы зафиксируем их в квадратных скобках.

[maxVal,index] = max(popcorn,[],2); brandNames(index)
ans = 1x6string array "Gourmet" "Gourmet" "Gourmet" "Gourmet" "Gourmet" "Gourmet"

Мы можем использовать объектно-ориентированное программирование при построении приложения для группировки параметров (свойств) и функций (методов) в один класс. В то время как классы Python могут быть определены где угодно, классы MATLAB создаются в файле определения класса. Классы MATLAB могут быть полезны для большего контроля над тем, что можно и что нельзя делать с объектом, например, определить свойство как константу для отключения модификации. Ознакомьтесь с примером использования данных массива датчиков или следуйте приведенной ниже структуре класса.

Первоначально опубликовано на https://blogs.mathworks.com 19 февраля 2021 г.