不是答案;只是一个评论:
在比较性能之前,您需要确保两个函数返回相同的结果:
如果 Matlab 的 convn 返回与 Octave 的 convn 相同的结果,则
convn
不同于ndimage.convolve
:
octave> convn(ones(3,3), ones(2,2))
ans =
1 2 2 1
2 4 4 2
2 4 4 2
1 2 2 1
In [99]: ndimage.convolve(np.ones((3,3)), np.ones((2,2)))
Out[99]:
array([[ 4., 4., 4.],
[ 4., 4., 4.],
[ 4., 4., 4.]])
ndimage.convolve
有其他模式,'reflect','constant','nearest','mirror', 'wrap'
但这些都不匹配convn
的默认(“完整”)行为。
对于 2D 数组,scipy.signal.convolve2d
比scipy.signal.convolve
.
对于 3D 数组,scipy.signal.convolve
似乎具有与以下相同的行为convn(A,B)
:
octave> x = convn(ones(3,3,3), ones(2,2,2))
x =
ans(:,:,1) =
1 2 2 1
2 4 4 2
2 4 4 2
1 2 2 1
ans(:,:,2) =
2 4 4 2
4 8 8 4
4 8 8 4
2 4 4 2
ans(:,:,3) =
2 4 4 2
4 8 8 4
4 8 8 4
2 4 4 2
ans(:,:,4) =
1 2 2 1
2 4 4 2
2 4 4 2
1 2 2 1
In [109]: signal.convolve(np.ones((3,3,3), dtype='uint8'), np.ones((2,2,2), dtype='uint8'))
Out[109]:
array([[[1, 2, 2, 1],
[2, 4, 4, 2],
[2, 4, 4, 2],
[1, 2, 2, 1]],
[[2, 4, 4, 2],
[4, 8, 8, 4],
[4, 8, 8, 4],
[2, 4, 4, 2]],
[[2, 4, 4, 2],
[4, 8, 8, 4],
[4, 8, 8, 4],
[2, 4, 4, 2]],
[[1, 2, 2, 1],
[2, 4, 4, 2],
[2, 4, 4, 2],
[1, 2, 2, 1]]], dtype=uint8)
请注意,默认情况下np.ones((n,m,p))
会创建一个浮点数组。Matlabones(n,m,p)
似乎创建了一个整数数组。为了进行良好的比较,您应该尝试将 numpy 数组的 dtype 与 Matlab 矩阵的类型相匹配。