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

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

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

Вход сигнала

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

Вы не можете программно задать разреженные типы входа при помощи assert операторы.

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

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

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

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

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

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

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

Вы не можете назначить разреженные данные данным, которые не разрежены. Сгенерированный код использует различные представления типов данных для разреженных и полных матриц. Чтобы преобразовать в разреженные данные и из них, используйте явное 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) = [];

См. также

| | | |

Похожие темы