Вне создания кода MATLAB ® по умолчанию использует компоновку «основной столбец». Спецификации компоновки массива не влияют на автономный код MATLAB. Для проверки эффективности созданного кода или функционального блока MATLAB создайте отдельные версии с основным макетом строки и основным макетом столбца. Затем сравните их производительность.
Можно разработать код MATLAB, чтобы избежать потенциальной неэффективности, связанной с компоновкой массива. Неэффективность может быть вызвана:
Преобразования между макетом основной строки и макетом основной строки.
Одномерная или линейная индексация основных данных строк.
Переформатирование или перегруппировка основных данных строк.
Преобразования макета массива необходимы при смешивании спецификаций «строка-большая» и «столбец-большая» в одном и том же коде или модели или при использовании линейного индексирования данных, хранящихся в «строка-большая». При моделировании модели или создании кода для модели, использующей столбец-мажор и содержащей блок функции MATLAB, использующий строку-мажор, программное обеспечение преобразует входные данные в строку-мажор и выходные данные обратно в столбец-мажор при необходимости, и наоборот.
Неэффективность может быть вызвана функциями или алгоритмами, которые менее оптимизированы для данного выбора компоновки массива. Если функция или алгоритм более эффективны для другого макета, можно принудительно применить этот макет, внедрив его в другую функцию с помощью coder.rowMajor или coder.columnMajor звоните.
Рассмотрим код для myMixedFn2, которая использует coder.ceval для передачи данных с компоновкой «основная строка» и «основной столбец»:
function [B, C] = myMixedFn2(x,y) %#codegen % specify type of return arguments for ceval calls A = zeros(size(x)); B = zeros(size(x)); C = zeros(size(x)); % include external C functions that use row-major & column-major coder.cinclude('addMatrixRM.h'); coder.updateBuildInfo('addSourceFiles', 'addMatrixRM.c'); coder.cinclude('addMatrixCM.h'); coder.updateBuildInfo('addSourceFiles', 'addMatrixCM.c'); % call C function that uses column-major order coder.ceval('-layout:columnMajor','addMatrixCM', ... coder.rref(x),coder.rref(y),coder.wref(A)); % compute B for i = 1:numel(A) B(i) = A(i) + 7; end % call C function that uses row-major order coder.ceval('-layout:rowMajor','addMatrixRM', ... coder.rref(y),coder.rref(B),coder.wref(C)); end
Внешние файлы:
Объявите объект конфигурации, cfg. Создание кода, использующего макет основной строки, с помощью -rowmajor вариант.
cfg = coder.config('lib'); cfg.HighlightPotentialRowMajorIssues = true; codegen myMixedFn2 -args {ones(20,10),ones(20,10)} -config cfg -launchreport -rowmajor
Выделенные проблемы отображаются в отчете о создании кода на вкладке Анализ кода в разделе Потенциальные основные проблемы строки.

Здесь происходит неэффективность компоновки массива по следующей причине:
Генератор кода должен преобразовывать входные переменные x и y в компоновку «основной столбец» перед их передачей в addMatrixCM. Транспозы должны быть вставлены в созданный код.
Генератор кода должен транспонировать выходную переменную A обратно в главную строку, потому что myMixedFn2 использует макет основной строки.
Цикл for использует линейное индексирование, для которого требуются основные данные столбца. Генератор кода должен пересчитать линейное индексирование, поскольку переменные A и B хранятся в строке-мажоре.
Генератор кода следует основной семантике столбца 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