narray-convolve 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c96997545f196ef2e81ca16ead2bfcd79023e417bf37cd8afc52bee6a2375990
4
- data.tar.gz: b9f17105c3accb3eebe697562b35eb81dae9053d958dc69277cdd3f8f93c191b
3
+ metadata.gz: bf62c9359db179d212da6a852c5f8424e8d3bb1c00f80f27cc1239299b199a8e
4
+ data.tar.gz: 721e8321d0aa9a25cfe16858aadc65e71f15b06f6641f2991f1dccee20049d69
5
5
  SHA512:
6
- metadata.gz: '0024721187219f45ec1a87b0b182d978bd86e245bed7045b35de02c56289d56e734b6a0b5a0cf144dbc1c1744b21ab7e176fa8bcdd03b3dc5f68cf10957748dc'
7
- data.tar.gz: 5be09f6ac1dfb5a5cef1b0e46681482cca2af24c5a803757e0409ea3fd0a4bfc8e78eeee42eb685b53988c6a1edcaecd8e6861bf54f71e5440d8d05e03dc547e
6
+ metadata.gz: 16ef98924a5a72077e8a6df22e233d40e64304fd148f592dc09f62ce7bb37a6f07e0e2a86c8af17bbb71f26682ee647daf66b8e6b5efb1ed930d4ac280fd5220
7
+ data.tar.gz: 02c7f51d8805acf72658df1987554a796b45e9eaf90561d68de5be71ee724909b7a948708a810afa1a8d8fc9805dc297835197b762bb3260c210ee76e9d08e76
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/narray-convolve.svg)](https://badge.fury.io/rb/narray-convolve)
2
+
1
3
  # Narray::Convolve
2
4
 
3
5
  Narray::Convolve is returns the discrete, linear convolution of two one-dimensional sequences.
@@ -1,44 +1,102 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "convolve/version"
4
- require "numo/narray"
5
-
6
- module Narray
7
- module Convolve
8
-
9
- def convolve(n, m, mode = :full)
10
- zero_size = m.size - 1
11
- out_size = zero_size + n.size
12
- n_end = out_size - 1
13
- work_size = out_size + zero_size
14
-
15
- out = Numo::DFloat.zeros(out_size)
16
- work = Numo::DFloat.zeros(work_size)
17
- work[zero_size..n_end].store(n[true])
18
-
19
- work_size.times do |i|
20
- w = i + zero_size
21
- if w < work_size
22
- mul = work[i..w] * m
23
- out[i] = mul.sum
24
- end
25
- end
26
-
27
- case mode
28
- when :full # full: (N+M-1)
29
- ans = out[true]
30
- when :same # same: [M,N].max
31
- s = (m.size / 2.0).round - 1
32
- e = s + n.size
33
- ans = out[s...e]
34
- when :valid # valid: [M,N].max - [M,N].min + 1
35
- s = zero_size
36
- e = m.size
37
- ans = out[s..-e]
38
- end
39
- ans
40
- end
41
- module_function :convolve
42
- end
43
- end
44
-
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "convolve/version"
4
+ require "numo/narray"
5
+
6
+ module Narray
7
+ module Convolve
8
+ # ======================================
9
+ #
10
+ # Narray::Convolve is similar to numpy.convolve,
11
+ # but with a different order of second arguments.
12
+ #
13
+ # @example
14
+
15
+ # Narray::Convolve
16
+ # ```
17
+ # require "narray/convolve"
18
+ # n = Numo::DFloat[1,2,3]
19
+ # m = Numo::DFloat[0,1,0.5].reverse
20
+ # Narray::Convolve.convolve(n, m, :same)
21
+ # => [1, 2.5, 4]
22
+ #
23
+ # or
24
+ #
25
+ # Narray::Convolve.convolve([1,2,3], [0,1,0.5].reverse, :same)
26
+ # => [1, 2.5, 4]
27
+ # ```
28
+ #
29
+ # numpy.convolve
30
+ # ```
31
+ # >>> numpy.convolve([1,2,3],[0,1,0.5], 'same')
32
+ # array([1. , 2.5, 4. ])
33
+ # ```
34
+ #
35
+ # ======================================
36
+ #
37
+ # @param:
38
+ # n: (Numo::NArray, DFloat)
39
+ # m: (Numo::NArray, DFloat)
40
+ # mode: (Symbol) {:full, :same, :valid}
41
+ #
42
+ # @Return: (Numo::NArray, DFloat)
43
+ # convolution of n and m.
44
+ #
45
+ def convolve(n, m, mode = :full)
46
+ case n
47
+ when Array
48
+ n = Numo::DFloat.cast(n)
49
+ when Numo::DFloat
50
+ # ok
51
+ else
52
+ raise ArgumentError, "not Numo::DFloat: #{n.inspect[0..48]}"
53
+ end
54
+
55
+ case m
56
+ when Array
57
+ m = Numo::DFloat.cast(m)
58
+ when Numo::DFloat
59
+ # ok
60
+ else
61
+ raise ArgumentError, "not Numo::DFloat: #{n.inspect[0..48]}"
62
+ end
63
+
64
+ n_size = n.size
65
+ m_size = m.size
66
+ zero_size = m_size - 1
67
+ out_size = zero_size + n_size
68
+ n_end = out_size - 1
69
+ work_size = out_size + zero_size
70
+
71
+ out = Numo::DFloat.zeros(out_size)
72
+ work = Numo::DFloat.zeros(work_size)
73
+ work[zero_size..n_end].store(n[true])
74
+
75
+ work_size.times do |i|
76
+ w = i + zero_size
77
+ if w < work_size
78
+ out[i] = work[i..w].mulsum(m)
79
+ end
80
+ end
81
+
82
+ case mode
83
+ when :full
84
+ # full: (N+M-1)
85
+ ans = out[true]
86
+ when :same
87
+ # same: [M,N].max
88
+ s = (m_size / 2.0).round - 1
89
+ e = s + n_size
90
+ ans = out[s...e]
91
+ when :valid
92
+ # valid: [M,N].max - [M,N].min + 1
93
+ s = zero_size
94
+ e = m_size
95
+ ans = out[s..-e]
96
+ end
97
+ ans
98
+ end
99
+ module_function :convolve
100
+ end
101
+ end
102
+
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Narray
4
4
  module Convolve
5
- VERSION = "0.1.1"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: narray-convolve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - icm7216