Есть ли способ векторизовать использование сжатия в Matlab? - PullRequest
4 голосов
/ 13 марта 2012

В настоящее время я использую squeeze для удаления двух одноэлементных измерений из матрицы.Матрица представляет собой большую 4d матрицу M(:,:,:,:).Первые два измерения - это координаты строки и столбца (y и x).Переменная в третьем измерении (indexes) выбирает несколько значений в третьем измерении: M.

В цикле for, который я выполняю, матрица M адресуется как M(y,x,indexes,:), чтоделает первые два измерения одноэлементными размерами.Эти размеры затем удаляются с помощью squeeze для использования в pdist, например так:

pdist(squeeze(M(y,x,indexes,:)))

Могу ли я векторизовать использование squeeze в этом случае?(Это занимает много времени в цикле)

Ответы [ 2 ]

5 голосов
/ 13 марта 2012

Если матрица M не изменяется внутри цикла, простое решение состоит в изменении порядка размеров матрицы с помощью PERMUTE перед запуском цикла for:

Mperm = permute(M,[3 4 1 2]);

Тогда вы можете обратиться Mperm вместо M как Mperm(:,:,y,x).

1 голос
/ 05 февраля 2014

Для такого типа проблем использование reshape часто является значительным улучшением сжатия.У меня была проблема, когда сжатие занимало примерно половину времени, необходимого для запуска функции.Используя профилировщик, я мог видеть, как squeeze делает ряд ненужных проверок.Использование функции изменения формы сократило время для той же операции до 15% от требуемого исходного времени.

...