Генерация кода для разреженных матриц

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

Функции для создания и манипулирования разреженными матрицами перечислены в Sparse Matrices. Чтобы проверить, поддерживается ли функция для генерации кода, смотрите страницу с описанием функции. Генерация кода не поддерживает разреженные матричные входы для всех функций.

Инструкции по генерации кода

Инициализируйте матрицы с помощью разреженных конструкторов, чтобы максимизировать эффективность кода. Для примера, чтобы создать матрицу тождеств 3 на 3, используйте speye(3,3) а не sparse(eye(3,3)).

Индексированное назначение в разреженные матрицы несет накладные расходы по сравнению с индексированным назначением в полные матрицы. Для примера:

S = speye(10);
S(7,7) = 42;

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

Ограничения генерации кода

Генерация кода не поддерживает разреженные матрицы для Simulink® сигналы, параметры или память хранилища данных. Сохранение и восстановление состояния симуляции не поддерживаются.

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

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

Вы не можете задать разреженную матрицу с конкурирующими спецификациями размера. Генератор кода фиксирует размер разреженной матрицы, когда он производит соответствующее определение типов в C/C + +. Как пример, функция foo вызывает ошибку в генерации кода:

function y = foo(n)
%#codegen
if n > 0
    y = sparse(3,2);
else
    y = sparse(4,3);
end

Логическое индексирование в разреженные матрицы не поддерживается для генерации кода. Для примера этот синтаксис вызывает ошибку:

S = magic(3);
S(S > 7) = 42;

Для разреженных матриц вы не можете удалить элементы массива, назначив пустые массивы:

S(:,2) = [];

См. также

| | |

Похожие темы