Zwei Funktionen, die ein RGB-Bild in ein Graustufenbild umwandeln:Was sind die Gründe für dieses Benchmark-Ergebnis?
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
Und:
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
Die erste Loops ist, während die zweite Vektorisierung verwendet.
Wenn sie Benchmarking (mit dem Benchmark-Paket) Ich erhalte die folgenden Ergebnisse für unterschiedlich große Eingangsbilder (f1
ist die Schleife Version, f2
die vektorisierte Version):
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 |
:
Ich erwartete eine Funktion schneller als die andere (vielleicht f1 wegen der inbounds Makro).
Aber ich kann nicht erklären, warum die vektorisierte Version für größere Bilder schneller wird. Warum ist das?
Ich denke, die Aussage 'grau = ähnlich (A, Größe (A) [1: 2] ...)' in der vektorisierte Version nicht erforderlich ist, erstellt die Sprache der richtigen Array-Größe direkt von der zweiten Anweisung. Dies erklärt jedoch nicht, warum die vektorisierte Version schneller wird. – cfh
Off-topic, aber Sie können 'convert (Array {Gray {Float64}}, A)' sagen, wenn Sie 'Bilder verwenden'. – tholy