Hai chức năng chuyển đổi một hình ảnh rgb đến một hình ảnh thang xám:Lý do cho kết quả điểm chuẩn này là gì?
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
Và:
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
là Người đầu tiên sử dụng các vòng lặp, trong khi cái thứ hai sử dụng vector hóa.
Khi benchmarking họ (với gói Benchmark) tôi nhận được kết quả như sau cho hình ảnh đầu vào có kích thước khác nhau (f1
là phiên bản lặp, f2
phiên bản vectorized):
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 |
Tôi mong đợi một hàm sẽ nhanh hơn hàm kia (có thể là f1 vì macro cận cảnh).
Nhưng tôi không thể giải thích, tại sao phiên bản vectơ trở nên nhanh hơn cho hình ảnh lớn hơn. Tại sao vậy?
Tôi nghĩ rằng tuyên bố 'xám = tương tự (A, kích thước (A) [1: 2] ...) 'trong phiên bản vectorized là không cần thiết, ngôn ngữ sẽ tạo thích hợp kích thước mảng trực tiếp từ câu lệnh thứ hai. Điều này không giải thích tại sao phiên bản vectơ lại nhanh hơn. – cfh
Off-topic, nhưng bạn có thể nói 'convert (Array {Gray {Float64}}, A)' nếu bạn đang 'sử dụng Images'. – tholy