1 回答
TA贡献1806条经验 获得超5个赞
如果我们用 表示输入向量,用 表示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
添加回答
举报