| 23 @inline function inside(i, aʹ, bʹ, a, b) |
24 @inline function inside(i, aʹ, bʹ, a, b) |
| 24 return (max(a, i - aʹ) - i):(min(b, i + bʹ) - i) |
25 return (max(a, i - aʹ) - i):(min(b, i + bʹ) - i) |
| 25 end |
26 end |
| 26 |
27 |
| 27 function simple_imfilter(b::Array{Float64,2}, |
28 function simple_imfilter(b::Array{Float64,2}, |
| 28 kernel::OffsetArray{Float64,2,Array{Float64,2}}) |
29 kernel::OffsetArray{Float64,2,Array{Float64,2}}; |
| |
30 threads::Bool=true) |
| 29 |
31 |
| 30 n, m = size(b) |
32 n, m = size(b) |
| 31 k, 𝓁 = size(kernel) |
33 k, 𝓁 = size(kernel) |
| 32 o₁, o₂ = kernel.offsets |
34 o₁, o₂ = kernel.offsets |
| 33 a₁, a₂ = k + o₁, 𝓁 + o₂ |
35 a₁, a₂ = k + o₁, 𝓁 + o₂ |
| 36 |
38 |
| 37 @assert(isodd(k) && isodd(𝓁)) |
39 @assert(isodd(k) && isodd(𝓁)) |
| 38 |
40 |
| 39 res = similar(b) |
41 res = similar(b) |
| 40 |
42 |
| 41 Threads.@threads for i=1:n |
43 @threadsif threads for i=1:n |
| 42 @inbounds for j=1:m |
44 @inbounds for j=1:m |
| 43 tmp = 0.0 |
45 tmp = 0.0 |
| 44 it₁ = inside(i, a₁, b₁, 1, n) |
46 it₁ = inside(i, a₁, b₁, 1, n) |
| 45 it₂ = inside(j, a₂, b₂, 1, m) |
47 it₂ = inside(j, a₂, b₂, 1, m) |
| 46 for p=it₁ |
48 for p=it₁ |