Проект кода для размещения массива основных строк

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

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

  • Преобразования между размещением основной строки и размещением основной колонны.

  • Одномерная или линейная индексация данных основной строки.

  • Изменение формы или перестройка данных основной строки.

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

Неэффективности могут быть вызваны функциями или алгоритмами, которые менее оптимизированы для заданного выбора размещения массива. Если функция или алгоритм более эффективны для другого размещения, можно применить это размещение, встраивая его в другую функцию с 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

Для MATLAB Coder™, чтобы сгенерировать код, который использует размещение основной строки, введите:

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 приводит к тому же выход результату, сгенерированному с помощью основного размещения строки или основного размещения столбца.

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

См. также

| | | |

Похожие темы