【发布时间】:2015-04-20 08:30:51
【问题描述】:
将 rgb 图像转换为灰度图像的两个函数:
function rgb2gray_loop{T<:FloatingPoint}(A::Array{T,3})
r,c = size(A)
gray = similar(A,r,c)
for i = 1:r
for j = 1:c
@inbounds gray[i,j] = 0.299*A[i,j,1] + 0.587*A[i,j,2] + 0.114 *A[i,j,3]
end
end
return gray
end
还有:
function rgb2gray_vec{T<:FloatingPoint}(A::Array{T,3})
gray = similar(A,size(A)[1:2]...)
gray = 0.299*A[:,:,1] + 0.587*A[:,:,2] + 0.114 *A[:,:,3]
return gray
end
第一个使用循环,第二个使用向量化。
在对它们进行基准测试时(使用 Benchmark 包),对于不同大小的输入图像,我得到以下结果(f1 是循环版本,f2 是矢量化版本):
A = rand(50,50,3):
| Row | Function | Average | Relative | Replications |
|-----|----------|-------------|----------|--------------|
| 1 | "f1" | 3.23746e-5 | 1.0 | 1000 |
| 2 | "f2" | 0.000160214 | 4.94875 | 1000 |
A = rand(500,500,3):
| Row | Function | Average | Relative | Replications |
|-----|----------|------------|----------|--------------|
| 1 | "f1" | 0.00783007 | 1.0 | 100 |
| 2 | "f2" | 0.0153099 | 1.95527 | 100 |
A = rand(5000,5000,3):
| Row | Function | Average | Relative | Replications |
|-----|----------|----------|----------|--------------|
| 1 | "f1" | 1.60534 | 2.56553 | 10 |
| 2 | "f2" | 0.625734 | 1.0 | 10 |
我希望一个函数比另一个更快(可能是 f1,因为 inbounds 宏)。
但我无法解释,为什么矢量化版本对于较大的图像会变得更快。 这是为什么呢?
【问题讨论】:
-
我认为向量化版本中的
gray = similar(A,size(A)[1:2]...)语句是不必要的,该语言将直接从第二条语句创建适当的数组大小。不过,这并不能解释为什么矢量化版本变得更快。 -
题外话,但如果你是
using Images,你可以说convert(Array{Gray{Float64}}, A)。
标签: loops benchmarking vectorization julia