due funzioni che convertono un'immagine rgb un'immagine scala di grigio:Quali sono i motivi di questo risultato di riferimento?
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
E:
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
Il primo utilizza cicli, mentre la seconda utilizza vettorizzazione.
Quando li analisi comparativa (con il pacchetto Benchmark) I ottenere i seguenti risultati per le immagini in ingresso di dimensioni diverse (f1
è la versione ad anello, f2
la versione vettorializzare):
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 |
Mi aspettavo che una funzione fosse più veloce dell'altra (forse f1 a causa della macro inbundi).
Ma non posso spiegare, perché la versione vettoriale diventa più veloce per le immagini più grandi. Perché è quello?
penso che la dichiarazione 'grigia = simile (A, dimensioni (A) [1: 2] ...)' nella versione vettorizzati è inutile, la lingua creerà la giusta dimensione dell'array direttamente dalla seconda istruzione. Questo non spiega perché la versione vettoriale sia più veloce, però. – cfh
Off-topic, ma puoi dire 'convert (Array {Gray {Float64}}, A)' se stai usando 'Images'. – tholy