exponenta event banner

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

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

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

Определение входных данных

Вы можете использовать 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) = [];

См. также

| | | |

Связанные темы