Вне создания кода MATLAB ® по умолчанию использует компоновку «основной столбец». Спецификации компоновки массива не влияют на автономный код MATLAB. Для проверки эффективности созданного кода или функционального блока MATLAB создайте отдельные версии с основным макетом строки и основным макетом столбца. Затем сравните их производительность.
Можно разработать код MATLAB, чтобы избежать потенциальной неэффективности, связанной с компоновкой массива. Неэффективность может быть вызвана:
Преобразования между макетом основной строки и макетом основной строки.
Одномерная или линейная индексация основных данных строк.
Переформатирование или перегруппировка основных данных строк.
Преобразования макета массива необходимы при смешивании спецификаций «строка-большая» и «столбец-большая» в одном и том же коде или модели или при использовании линейного индексирования данных, хранящихся в «строка-большая». При моделировании модели или создании кода для модели, использующей столбец-мажор и содержащей блок функции MATLAB, использующий строку-мажор, программное обеспечение преобразует входные данные в строку-мажор и выходные данные обратно в столбец-мажор при необходимости, и наоборот.
Неэффективность может быть вызвана функциями или алгоритмами, которые менее оптимизированы для данного выбора компоновки массива. Если функция или алгоритм более эффективны для другого макета, можно принудительно применить этот макет, внедрив его в другую функцию с помощью coder.rowMajor или coder.columnMajor звоните.
Генератор кода следует основной семантике столбца MATLAB для линейного индексирования. Дополнительные сведения о линейном индексировании в MATLAB см. в разделе Индексирование массива.
Чтобы использовать линейную индексацию для основных данных строки, генератор кода должен сначала пересчитать представление данных в макете основной строки. Эта дополнительная обработка может замедлить производительность. Чтобы повысить эффективность кода, избегайте использования линейной индексации для основных данных строки или используйте компоновку «основной столбец» для кода, использующего линейную индексацию.
Например, рассмотрим функцию sumShiftedProducts, которая принимает матрицу в качестве входного значения и выводит скалярное значение. Функция использует линейное индексирование на входной матрице для суммирования произведения каждого элемента матрицы со смежным элементом. Выходное значение этой операции зависит от порядка хранения входных элементов.
function mySum = sumShiftedProducts(A) %#codegen mySum = 0; % create linear vector of A elements B = A(:); % multiply B by B with elements shifted by one, and take sum mySum = sum( B.*circshift(B,1) ); end
Для Coder™ MATLAB, чтобы создать код, использующий формат основной строки, введите:
codegen -config:mex sumShiftedProducts -args {ones(2,3)} -launchreport -rowmajor
В качестве примера ввода рассмотрим матрицу:
D = reshape(1:6,3,2)'
который дает:
D =
1 2 3
4 5 6
Если передать эту матрицу в качестве ввода в сгенерированный код, элементы A хранятся в порядке:
1 2 3 4 5 6
Напротив, потому что вектор B получается линейным индексированием, хранится в порядке:
1 4 2 5 3 6
Генератор кода должен вставить операцию изменения формы, чтобы переупорядочить данные из основного макета строки для A к основной компоновке столбца для B. Эта дополнительная операция снижает эффективность функции для размещения основных строк. Неэффективность увеличивается с увеличением размера массива. Поскольку линейное индексирование всегда использует компоновку «основной столбец», созданный код для sumShiftedProducts приводит к тому же результату, что и в случае компоновки «главная строка» или «главный столбец».
Как правило, функции, которые вычисляют индексы или подстрочные индексы, также используют линейное индексирование и дают результаты, соответствующие данным, хранящимся в макете «основной столбец». К этим функциям относятся:
coder.ceval | coder.columnMajor | coder.isColumnMajor | coder.isRowMajor | coder.rowMajor