Module: Narray::Convolve

Defined in:
lib/narray/convolve.rb,
lib/narray/convolve/version.rb

Constant Summary collapse

VERSION =
"0.2.0"

Class Method Summary collapse

Class Method Details

.convolve(n, m, mode = :full) ⇒ Object

Narray::Convolve “‘ require “narray/convolve” n = Numo::DFloat m = Numo::DFloat.reverse Narray::Convolve.convolve(n, m, :same)

> [1, 2.5, 4]

or

Narray::Convolve.convolve(, [0,1,0.5].reverse, :same)

> [1, 2.5, 4]

“‘

numpy.convolve “‘ >>> numpy.convolve(,[0,1,0.5], ’same’) array([1. , 2.5, 4. ]) “‘

@param:

n: (Numo::NArray, DFloat)
m: (Numo::NArray, DFloat)
mode: (Symbol) {:full, :same, :valid}

@Return: (Numo::NArray, DFloat)

convolution of n and m.


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/narray/convolve.rb', line 45

def convolve(n, m, mode = :full)
  case n
  when Array
    n = Numo::DFloat.cast(n)
  when Numo::DFloat
    # ok
  else
    raise ArgumentError, "not Numo::DFloat: #{n.inspect[0..48]}"
  end

  case m
  when Array
    m = Numo::DFloat.cast(m)
  when Numo::DFloat
    # ok
  else
    raise ArgumentError, "not Numo::DFloat: #{n.inspect[0..48]}"
  end

  n_size = n.size
  m_size = m.size
  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
      out[i] = work[i..w].mulsum(m)
    end
  end

  case mode
  when :full
    # full: (N+M-1)    
    ans = out[true]
  when :same
    # same: [M,N].max
    s = (m_size / 2.0).round - 1
    e = s + n_size
    ans = out[s...e]
  when :valid
    # valid: [M,N].max - [M,N].min + 1
    s = zero_size
    e = m_size
    ans = out[s..-e]
  end
  ans
end