Вот пара учебников MathWorks, на которые я часто ссылаюсь в качестве ссылок по этому вопросу:
А вот одна из записей блога Лорена, в которой хорошо показана векторизация кода для конкретного примера задачи:
Конкретный тип задачи, который вы привели в качестве примера, включающий обработку подматриц заданной матрицы, может быть векторизован различными способами в зависимости от того, какую операцию вы выполняете. Возможно, вы сможете использовать CONV2 или FILTER2 вместо вложенных циклов for. В Панели инструментов обработки изображений также есть ряд функций, которые обрабатывают окрестности и блочную обработку матриц, например NLFILTER и BLOCKPROC. Документация к этим функциям должна помочь вам понять, как использовать их в качестве способа векторизации вашего кода.
Практическое правило состоит в том, что вы должны использовать встроенные функции Matlab, которые работают с массивами вместо циклов, когда это возможно. Например, мне кажется, что описанная вами проблема может быть сформулирована как свертка, а затем вы можете использовать функции matlab conv2 ()
или filter ()
для ее реализации. без петли.
Другой общий прием - попытаться сформулировать проблему в терминах матричных операций.
Вы также должны предпочитать торговать пространством на время. Допустим, у вас есть n-мерный вектор v
и матрица m x n M
, где каждая строка также является n-мерным вектором. Допустим, вам нужны евклидовы расстояния между v
и каждой строкой M
. В этом случае вы должны использовать repmat ()
, чтобы создать матрицу, содержащую m копий v
, и вычислить расстояния, используя поэлементные операции с массивами без цикла.