Если мы обозначим входной вектор X
, а выходной (свернутый) вектор - Y
, то каждый Y(i)
состоит из линейной комбинации некоторых элементов X
:
Y(i) = Sum{j} X(j) * kernel(kernelIndex(i, j))
kernelIndex
- это функция, которая дает вам определенную позицию для доступа к вашему ядру для данной свертки и обычно зависит от реализации (т. Е. От того, как вы индексируете свой ввод / вывод).
Для нашегоцели Y(i)
и X(j)
известны, а kernel(…)
неизвестны.Поэтому для каждого выхода Y(i)
мы можем сформулировать линейное уравнение (как указано выше) `.Мы можем собрать все эти уравнения и решить для неизвестных записей ядра.Вот пример реализации в Matlab:
function [kernel] = solveConv(source, target, kernelSize)
sizeOfSource = size(source);
sizeOfSource = sizeOfSource(2);
% linear system A x = b
A = zeros(sizeOfSource, kernelSize);
b = zeros(sizeOfSource, 1);
for i = 1 : sizeOfSource
for j = 1 : kernelSize
sourceIndex = i + (kernelSize - j) - floor(kernelSize / 2);
if sourceIndex >= 1 && sourceIndex <= sizeOfSource
A(i, j) = source(sourceIndex);
end
end
b(i, 1) = target(i);
end
% solve the linear system
kernel = A \ b;
end
Вы можете использовать эту функцию для получения своего ядра:
>> solveConv([1,2,3,4,5,6,7,8,9,10], [-2 -2 -2 -2 -2 -2 -2 -2 -2 9],3)
ans =
-1.0000
-0.0000
1.0000
Или, если вы не уверены в размере ядра, попробуйте большийядро:
>> solveConv([1,2,3,4,5,6,7,8,9,10], [-2 -2 -2 -2 -2 -2 -2 -2 -2 9],5)
ans =
-0.0000
-1.0000
-0.0000
1.0000
-0.0000