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

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

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

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

Инициализируйте матрицы при помощи разреженных конструкторов, чтобы максимизировать вашу эффективность кода. Например, чтобы создать 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) = [];

Смотрите также

| | |

Похожие темы

Была ли эта тема полезной?