9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
# File 'lib/narray/convolve.rb', line 9
def convolve(n, m, mode = :full)
zero_size = m.size - 1
out_size = zero_size + n.size
n_end = out_size - 1
work_size = out_size + zero_size
out = Numo::DFloat.zeros(out_size)
work = Numo::DFloat.zeros(work_size)
work[zero_size..n_end].store(n[true])
work_size.times do |i|
w = i + zero_size
if w < work_size
mul = work[i..w] * m
out[i] = mul.sum
end
end
case mode
when :full ans = out[true]
when :same s = (m.size / 2.0).round - 1
e = s + n.size
ans = out[s...e]
when :valid s = zero_size
e = m.size
ans = out[s..-e]
end
ans
end
|