Matlab中conv2的替代方案
我正在玩Matlab,尝试各种不同的东西,并找到不用内置函数就能实现的方法。 显然,Matlab(根据谷歌及其网站)没有发布“conv2”函数的源代码 是否有“conv2(h1,h2,A)”的替代功能,或者是否有一种不使用MatlabsMatlab中conv2的替代方案,matlab,Matlab,我正在玩Matlab,尝试各种不同的东西,并找到不用内置函数就能实现的方法。 显然,Matlab(根据谷歌及其网站)没有发布“conv2”函数的源代码 是否有“conv2(h1,h2,A)”的替代功能,或者是否有一种不使用Matlabsconv2而编写自己版本的代码的方法 Matlab中的help选项/关键字并没有真正帮助我 ----编辑---- 这是作为conv2(A,B)替代的代码。但是我正在寻找类似的东西来处理conv2(h1,h2,A) 我完全同意Jonas的观点,但我会让您参考FEX的
conv2
而编写自己版本的代码的方法
Matlab中的help
选项/关键字并没有真正帮助我
----编辑----
这是作为conv2(A,B)
替代的代码。但是我正在寻找类似的东西来处理conv2(h1,h2,A)
我完全同意Jonas的观点,但我会让您参考FEX的另一个选项:2D conv使用
svd
,以便在某些情况下更快(您需要从代码中挖掘出来)。以下是一些在不使用conv2
的情况下进行卷积的想法
- 使用
将滑动窗口转换为列,然后在每列上并行执行卷积im2col
- 使用傅里叶变换:
-您必须先填充内核ifft(fft(A)。*fft(B))
我真的不理解这里的问题——你认为什么是“酷的方式”?无论如何,代码不可用的原因是它已经被编译过了,所以运行速度要快得多。如果您对源代码感兴趣,请查看开源Ocave中的卷积函数。另一方面,内置函数的存在是您首先使用Matlab的原因;如果你喜欢自己写所有东西,你可以在C++(或者java或Python)中工作得更好。我是自学的,我不认为通过内置函数来实现很多学习。我只是想看看其他人是否已经开始使用内置函数了。在这个阶段,速度不是问题,这很公平。无论如何,仍然很难看出您真正想要的答案是什么-一种不使用
conv2
的卷积方法?什么能让答案“酷”?哈哈,是的。请原谅我的术语。这将被认为是很酷的。了解conv2
的功能并制定自己的算法。你也没有通过询问SO来学到那么多代码。
function B = convolve(A, k);
[r c] = size(A);
[m n] = size(k);
h = rot90(k, 2);
center = floor((size(h)+1)/2);
left = center(2) - 1;
right = n - center(2);
top = center(1) - 1;
bottom = m - center(1);
Rep = zeros(r + top + bottom, c + left + right);
for x = 1 + top : r + top
for y = 1 + left : c + left
Rep(x,y) = A(x - top, y - left);
end
end
B = zeros(r , c);
for x = 1 : r
for y = 1 : c
for i = 1 : m
for j = 1 : n
q = x - 1;
w = y -1;
B(x, y) = B(x, y) + (Rep(i + q, j + w) * h(i, j));
end
end
end
end