Почему Scipy имеет разные функции «signal.convolve2d» и «signal.correlate2d»? - PullRequest
0 голосов
/ 22 января 2019

Когда «signal.convolve2d» и «signal.correlate2d» (с одинаковыми аргументами) дают разные результаты?

Я только начал использовать Scipy, и я не могу определить разницу в использовании signal.correlate2d (массив, фильтр, «то же самое») и signal.convolve2d (массив, фильтр, «то же самое»), в то время как результаты идентичны в все дела, которые я пробовал.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Они выполняют, потому что на самом деле выполняют другую задачу

signal.convolve2d() #does convolving
signal.correlate2d() #does just cross-correlation

Свертка выполняет взаимную корреляцию с фильтром, который был отражен по горизонтали и вертикали.

Кросс-корреляция - это то, чтообычно это делается при глубоком обучении, когда вы выполняете умножение, используя свой фильтр как есть.

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

0 голосов
/ 22 января 2019

Посмотрите на их код.Они выглядят почти одинаково, за исключением одного:

sigtools._convolve2d(in1, in2.conj(), 0, val, bval, fillvalue)

и другого:

sigtools._convolve2d(in1, in2, 1, val, bval, fillvalue)

Предположительно, вы знаете достаточно о том, чтобы свернуться, чтобы объяснить разницу, верно?

Обычно ответы на why this code включают историю, которая может насчитывать годы.Разные люди пишут разные куски кода, они объединяются, и иногда незначительные различия остаются только ради обратной совместимости.Проще сохранить пару похожих версий, чем сказать пользователям: «Вы должны переключиться».

...