rmatrix 0.1.1 → 0.1.3
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 +4 -4
- data/lib/rmatrix.rb +3 -3
- data/lib/rmatrix/core.rb +2 -2
- data/lib/rmatrix/matrix.rb +54 -44
- data/lib/rmatrix/typecode.rb +14 -0
- data/lib/rmatrix/vector.rb +15 -6
- data/lib/rmatrix/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2669d0b3df98c92b74abe27833d0a1d11f39bf84
|
4
|
+
data.tar.gz: e28379824f051e318780f7599bfe1d640dbb3bf1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: adcd594922c431268a3f3734ee9e17055f29b05f3ede14bb1f9df17956bd19ce5f203ab78d5875caf5e1307d8b767fe3d9510545677673331c9d877297ea4471
|
7
|
+
data.tar.gz: 07642f99e0eca1b196fdee6889684f9271a3f0ea15d4e5c9edec8bb7e1cfd72a361547887b3b41b169be2d5b58da77d6443f718196be5e7e8b5787462dfe491b
|
data/lib/rmatrix.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require_relative "rmatrix/version"
|
2
|
+
require_relative "rmatrix/core"
|
3
|
+
require_relative "rmatrix/shortcuts"
|
data/lib/rmatrix/core.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative "matrix"
|
2
|
+
require_relative "vector"
|
data/lib/rmatrix/matrix.rb
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
module RMatrix
|
2
2
|
class Matrix
|
3
3
|
require 'narray'
|
4
|
+
require_relative 'typecode'
|
4
5
|
include Enumerable
|
5
6
|
|
6
7
|
attr_accessor :invert_next_operation, :matrix, :narray, :typecode
|
7
8
|
|
8
|
-
def initialize(source,
|
9
|
+
def initialize(source, typecode=Typecode::FLOAT)
|
9
10
|
self.typecode = typecode
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
self.narray = two_dimensional(source, typecode)
|
12
|
+
end
|
13
|
+
|
14
|
+
def matrix
|
15
|
+
@matrix ||= NMatrix.refer(narray)
|
16
|
+
end
|
14
17
|
|
15
|
-
|
16
|
-
self.
|
18
|
+
def self.blank(rows, cols, typecode=Typecode::FLOAT)
|
19
|
+
self.new(NArray.new(typecode, rows * cols).reshape(cols, rows), typecode)
|
17
20
|
end
|
18
21
|
|
19
22
|
def _dump(level)
|
@@ -22,7 +25,7 @@ module RMatrix
|
|
22
25
|
|
23
26
|
def self._load arg
|
24
27
|
typecode, columns, rows, as_str = arg.split(":",4)
|
25
|
-
Matrix.new(
|
28
|
+
Matrix.new(NArray.to_na(as_str.to_s, typecode.to_i).reshape(columns.to_i, rows.to_i), typecode.to_i)
|
26
29
|
end
|
27
30
|
|
28
31
|
def each(&block)
|
@@ -40,7 +43,7 @@ module RMatrix
|
|
40
43
|
yield elm
|
41
44
|
end
|
42
45
|
).to_type(typecode)
|
43
|
-
Matrix.new(as_na.reshape(*shape), typecode
|
46
|
+
Matrix.new(as_na.reshape(*shape), typecode)
|
44
47
|
end
|
45
48
|
|
46
49
|
def coerce(other)
|
@@ -61,16 +64,28 @@ module RMatrix
|
|
61
64
|
end
|
62
65
|
|
63
66
|
def sum_rows
|
64
|
-
Matrix.new(sum(0), typecode
|
67
|
+
Matrix.new(sum(0), typecode)
|
65
68
|
end
|
66
69
|
|
67
70
|
def sum_columns
|
68
|
-
Matrix.new(sum(1), typecode
|
71
|
+
Matrix.new(sum(1), typecode)
|
69
72
|
end
|
70
73
|
|
71
74
|
def two_dimensional(source, type)
|
72
|
-
|
73
|
-
|
75
|
+
case source
|
76
|
+
when NArray
|
77
|
+
if NMatrix === source
|
78
|
+
@matrix = source
|
79
|
+
source = NArray.refer(source)
|
80
|
+
end
|
81
|
+
when Numeric
|
82
|
+
source = NArray.to_na([source])
|
83
|
+
else
|
84
|
+
source = NArray.to_na(source)
|
85
|
+
end
|
86
|
+
|
87
|
+
source = source.to_type(type) unless type == source.typecode
|
88
|
+
|
74
89
|
case source.dim
|
75
90
|
when 1
|
76
91
|
source.reshape(source.length, 1)
|
@@ -96,7 +111,7 @@ module RMatrix
|
|
96
111
|
result[i] << cofactor(i, j)
|
97
112
|
end
|
98
113
|
end
|
99
|
-
return Matrix.new(result, typecode
|
114
|
+
return Matrix.new(result, typecode)
|
100
115
|
end
|
101
116
|
|
102
117
|
def determinant
|
@@ -118,18 +133,18 @@ module RMatrix
|
|
118
133
|
def *(other)
|
119
134
|
if other.kind_of?(Matrix)
|
120
135
|
raise "Matrix A columns(#{self.columns}) != Matrix B rows(#{other.columns})" if other.rows != self.columns
|
121
|
-
Matrix.new(self.matrix * other.matrix, typecode
|
136
|
+
Matrix.new(self.matrix * other.matrix, typecode)
|
122
137
|
else
|
123
|
-
Matrix.new(apply_scalar(:*, other), typecode
|
138
|
+
Matrix.new(apply_scalar(:*, other), typecode)
|
124
139
|
end
|
125
140
|
end
|
126
141
|
|
127
142
|
def mult(other)
|
128
|
-
Matrix.new(
|
143
|
+
Matrix.new(self.narray * other.narray, typecode)
|
129
144
|
end
|
130
145
|
|
131
146
|
def ==(other)
|
132
|
-
self.
|
147
|
+
self.narray == Matrix[other].narray
|
133
148
|
end
|
134
149
|
|
135
150
|
def to_s
|
@@ -145,6 +160,8 @@ module RMatrix
|
|
145
160
|
end
|
146
161
|
|
147
162
|
def inspect
|
163
|
+
return Vector::inspect_vector(self) if [rows, columns].include?(1)
|
164
|
+
|
148
165
|
inspect_rows = [10, self.rows].min
|
149
166
|
inspect_columns = [10, self.columns].min
|
150
167
|
more_rows = inspect_rows < self.rows
|
@@ -161,21 +178,11 @@ module RMatrix
|
|
161
178
|
|
162
179
|
|
163
180
|
def [](*args)
|
164
|
-
args.all?{|x| Fixnum === x } ? narray[*args.reverse] : Matrix.new(narray[*args.reverse], typecode
|
181
|
+
args.all?{|x| Fixnum === x } ? narray[*args.reverse] : Matrix.new(narray[*args.reverse], typecode)
|
165
182
|
end
|
166
183
|
|
167
184
|
def transpose
|
168
|
-
Matrix.new(self.matrix.transpose, typecode
|
169
|
-
end
|
170
|
-
|
171
|
-
def self.new(*args, &blk)
|
172
|
-
result = super
|
173
|
-
if result.class == Matrix && (result.rows == 1 || result.columns == 1)
|
174
|
-
vect = V[1]
|
175
|
-
vect.typecode, vect.matrix, vect.narray = result.typecode, result.matrix, result.narray
|
176
|
-
result = vect
|
177
|
-
end
|
178
|
-
result
|
185
|
+
Matrix.new(self.matrix.transpose, typecode)
|
179
186
|
end
|
180
187
|
|
181
188
|
def self.[](*inputs)
|
@@ -183,7 +190,7 @@ module RMatrix
|
|
183
190
|
inputs[0]
|
184
191
|
elsif inputs.length == 1 && [String, Symbol].include?(inputs[0].class)
|
185
192
|
if ['byte', 'sint', 'int', 'sfloat', 'float', 'scomplex', 'complex', 'object'].include?(inputs[0])
|
186
|
-
->(*source){ Matrix.new(source,
|
193
|
+
->(*source){ Matrix.new(source, inputs[0]) }
|
187
194
|
else
|
188
195
|
Matrix.new(inputs[0])
|
189
196
|
end
|
@@ -201,7 +208,7 @@ module RMatrix
|
|
201
208
|
|
202
209
|
def self.gen_matrix_delegator(name)
|
203
210
|
define_method(name) do |*args, &blk|
|
204
|
-
Matrix.new(matrix.send(name, *args, &blk), typecode
|
211
|
+
Matrix.new(matrix.send(name, *args, &blk), typecode)
|
205
212
|
end
|
206
213
|
end
|
207
214
|
|
@@ -213,7 +220,7 @@ module RMatrix
|
|
213
220
|
|
214
221
|
def self.gen_typeconstructor(name)
|
215
222
|
define_singleton_method(name) do
|
216
|
-
->(*source){ Matrix.new(source,
|
223
|
+
->(*source){ Matrix.new(source, name.to_s) }
|
217
224
|
end
|
218
225
|
end
|
219
226
|
|
@@ -222,25 +229,26 @@ module RMatrix
|
|
222
229
|
:^ => 'xor',
|
223
230
|
:| => 'or'
|
224
231
|
}
|
225
|
-
def translate_op(op)
|
232
|
+
def self.translate_op(op)
|
226
233
|
OPERATIONS_MAP.fetch(op, op)
|
227
234
|
end
|
228
235
|
|
229
236
|
[:fill!, :random!, :indgen!].each(&method(:gen_mutator))
|
230
237
|
[:reshape, :sort, :sort_index, :inverse, :lu, :delete_at, :where, :where2, :not, :-@].each(&method(:gen_matrix_delegator))
|
231
|
-
[:sum, :prod, :mean, :stddev, :rms, :rmsdev, :min, :max, :shape].each(&method(:gen_delegator))
|
238
|
+
[:sum, :prod, :mean, :stddev, :rms, :rmsdev, :min, :max, :shape, :to_a].each(&method(:gen_delegator))
|
232
239
|
[:byte, :sint, :int, :sfloat, :float, :scomplex, :complex, :object].each(&method(:gen_typeconstructor))
|
233
240
|
|
234
241
|
[:+, :/, :-, :**, :&, :^, :|].each do |op|
|
242
|
+
op = translate_op(op)
|
235
243
|
define_method(op) do |other|
|
236
|
-
|
237
|
-
|
244
|
+
result = case other
|
245
|
+
when Matrix
|
238
246
|
apply_elementwise(op, other)
|
239
247
|
else
|
240
248
|
apply_scalar(op, other)
|
241
249
|
end
|
242
250
|
Matrix.new(
|
243
|
-
result, typecode
|
251
|
+
result, typecode
|
244
252
|
)
|
245
253
|
end
|
246
254
|
end
|
@@ -251,9 +259,10 @@ module RMatrix
|
|
251
259
|
|
252
260
|
private
|
253
261
|
def test_inverse
|
254
|
-
|
255
|
-
|
256
|
-
|
262
|
+
if self.invert_next_operation
|
263
|
+
self.invert_next_operation = false
|
264
|
+
return true
|
265
|
+
end
|
257
266
|
end
|
258
267
|
|
259
268
|
def cofactor(i, j)
|
@@ -266,17 +275,18 @@ module RMatrix
|
|
266
275
|
if test_inverse
|
267
276
|
other.narray.send(op, self.narray)
|
268
277
|
else
|
269
|
-
narray.send(op,
|
278
|
+
narray.send(op, other.narray)
|
270
279
|
end
|
271
280
|
end
|
272
281
|
|
273
282
|
def apply_scalar(op, other)
|
274
283
|
if test_inverse
|
275
|
-
|
284
|
+
other.send(op, self.narray)
|
276
285
|
else
|
277
|
-
narray.send(op,
|
286
|
+
narray.send(op, other)
|
278
287
|
end
|
279
288
|
end
|
289
|
+
|
280
290
|
end
|
281
291
|
|
282
292
|
class ::NArray; include Enumerable; end
|
data/lib/rmatrix/vector.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
module RMatrix
|
2
2
|
class Vector < RMatrix::Matrix
|
3
3
|
|
4
|
-
def initialize(source)
|
5
|
-
|
4
|
+
def initialize(source, typecode=Typecode::FLOAT)
|
5
|
+
if narray
|
6
|
+
self.narray = narray
|
7
|
+
self.matrix = NMatrix.refer(matrix)
|
8
|
+
else
|
9
|
+
super
|
10
|
+
end
|
6
11
|
raise "Invalid dimensions #{shape.join(?x).reverse}. Vector must be eiter Nx1 or 1xM" unless [rows, columns].include?(1) && shape.length == 2
|
7
12
|
end
|
8
13
|
|
@@ -19,13 +24,17 @@ module RMatrix
|
|
19
24
|
end
|
20
25
|
|
21
26
|
def inspect
|
22
|
-
|
27
|
+
self.class.inspect_vector(self)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.inspect_vector(v)
|
31
|
+
elms = v.narray.to_a.flatten
|
23
32
|
print = elms.first(10)
|
24
33
|
has_more = elms.length > 10
|
25
|
-
if rows == 1
|
26
|
-
"Vector(#{narray.length})\nV[#{print.join(", ") + (has_more ? ',...' : '')}]"
|
34
|
+
if v.rows == 1
|
35
|
+
"Vector(#{v.narray.length})\nV[#{print.join(", ") + (has_more ? ',...' : '')}]"
|
27
36
|
else
|
28
|
-
"Vector(#{narray.length})\nV[\n [#{print.join("],\n [") + (has_more ? "\n ..." : '')}]\n]"
|
37
|
+
"Vector(#{v.narray.length})\nV[\n [#{print.join("],\n [") + (has_more ? "\n ..." : '')}]\n]"
|
29
38
|
end
|
30
39
|
end
|
31
40
|
end
|
data/lib/rmatrix/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmatrix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wouter Coppieters
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- lib/rmatrix/core.rb
|
117
117
|
- lib/rmatrix/matrix.rb
|
118
118
|
- lib/rmatrix/shortcuts.rb
|
119
|
+
- lib/rmatrix/typecode.rb
|
119
120
|
- lib/rmatrix/vector.rb
|
120
121
|
- lib/rmatrix/version.rb
|
121
122
|
- rmatrix.gemspec
|