narray-convolve 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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