Разреженные матрицы обеспечивают эффективное устройство хранения данных в памяти для массивов со многими нулевыми элементами. Разреженные матрицы могут обеспечить улучшенную производительность и уменьшаемое использование памяти для сгенерированного кода. Время вычисления на разреженных матрицах масштабируется только с количеством операций на ненулевых элементах.
Функции для создания и управления разреженными матрицами перечислены в Разреженных матрицах (MATLAB). Чтобы проверять, поддерживается ли функция для генерации кода, смотрите страницу ссылки на функцию. Генерация кода не поддерживает входные параметры разреженной матрицы для всех функций.
Можно использовать 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) = [];
coder.typeof
| full
| magic
| sparse
| speye