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₁ |