sparse_matrix 1.0.0 → 1.5.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
  SHA1:
3
- metadata.gz: 4120f3a75b5bbe035792ea2d4591242c98e47b8f
4
- data.tar.gz: fa31f06d130f45b3faf16c54f4856a3bc996d007
3
+ metadata.gz: e4890f260249f7bd02beb51cf3cc713d450dcae7
4
+ data.tar.gz: c1d4379a558a4cdfb340a9492cb7b4893a7196bf
5
5
  SHA512:
6
- metadata.gz: 9705df1392dd449ce9e1c22a027800fb79acc56e3d43de157a0c991fe7432870a7e789d54dcf38ad3ddd70f862fd441b992cb32414dd266250a0c910236ec75d
7
- data.tar.gz: 93eb2b3be78734d111532d11077a6e29b73bdeab7d20fcde756c755245050745ee8b99da043ccc8f263d367b4687521d082c535b39835c4e3cbe793c914a1068
6
+ metadata.gz: 5d56e3c8300c20e33415c72a700fa7e1c38a284d67a692b4b670a1a4aa9255fa7b6f6bdab22e79437f977189de37d087d3df856d02c174b77e5a56885475b9ce
7
+ data.tar.gz: b8e7865f84e0244438ab11453c350ecd4f30de4473ee3b4b8af75014646766760a55d5ac6d0ebb725843e1a48f9e26d37e17106dcd2d53ad2964a3cb7ddb5846
data/README.md CHANGED
@@ -37,10 +37,6 @@ And then execute:
37
37
  Or install it yourself as:
38
38
 
39
39
  $ gem install sparse_matrix
40
-
41
- ## Usage
42
- as soon as
43
-
44
40
  ## Authors
45
41
  Kevin Robayna
46
42
  Jose Antonio Rodriguez Leandro
data/lib/sparse_matrix.rb CHANGED
@@ -7,103 +7,152 @@ module SparseMatrix
7
7
  @row = r
8
8
  @column = c
9
9
  end
10
-
10
+
11
11
  attr_accessor :row,:column
12
-
13
- def read_matrix
14
12
 
13
+ def read_matrix
14
+ raise "Error. metodo no definido."
15
15
  end
16
16
 
17
17
  def to_s
18
-
18
+ raise "Error. metodo no definido."
19
19
  end
20
-
21
- def print_matrix
22
-
23
- end
24
-
25
- def +(b)
26
20
 
21
+ def print_matrix
22
+ raise "Error. metodo no definido."
27
23
  end
28
24
 
29
- def *(b)
30
-
31
- end
25
+ def +(b)
26
+ raise "Error. metodo no definido."
32
27
  end
28
+
29
+ def *(b)
30
+ raise "Error. metodo no definido."
31
+ end
32
+ end
33
33
 
34
- class SparseVector
35
- @i
36
- @j
37
- @value
34
+ class SparseVector
35
+ def initialize(i=0,j=0,v=0)
36
+ @i = i
37
+ @j = j
38
+ @value = v
39
+ end
40
+ attr_accessor :i,:j,:value
41
+
42
+ def to_s
43
+ "#{@i},#{@j},#{@value}"
44
+ end
45
+
46
+ end
38
47
 
48
+ class SparseMatrix < AbstractMatrix
49
+
50
+ def initialize(*args)
51
+ @n,@m=args[0],args[1]
52
+ datos = args[2]
53
+ @MAT = Array.new()
54
+ for i in 0...@n
55
+ for j in 0...@m
56
+ if datos[i][j] != 0
57
+ @MAT[i]=SparseVector.new(i,j,datos[i][j])
58
+ end
59
+ end
60
+ end
61
+ @max=max()
62
+ @min=min()
39
63
  end
64
+ attr_accessor :MAT
40
65
 
41
- class SparseMatrix < AbstractMatrix
66
+ def insert(vector)
67
+ @MAT<<vector
68
+ end
42
69
 
70
+ def to_s
71
+ cadena=""
72
+ for i in 0...@n
73
+ cadena+="["
74
+ for j in 0...@m
75
+ cadena+=self.valor(i,j).to_s
76
+ if j < @m-1
77
+ cadena+=", "
78
+ end
79
+ end
80
+ cadena+="]"
81
+ end
82
+ return cadena
83
+
84
+ end
43
85
 
86
+ def valor(k,j)
87
+ dev=0
88
+ for i in 0...@MAT.size
89
+ if(@MAT[i].i==k) && (@MAT[i].j==j)
90
+ return @MAT[i].value
91
+ end
92
+ end
93
+ dev
44
94
  end
45
95
 
46
96
 
47
- class DenseMatrix < AbstractMatrix
48
- @mat
49
- def initialize(r=0,c=0,matrix=[])
50
- super(r,c)
51
- @mat = matrix
97
+ def max
98
+ maximo=@MAT[0].value
99
+ for i in 0...@m do
100
+ if maximo < @MAT[i].value
101
+ maximo=@MAT[i].value
102
+ end
103
+ end
104
+ return maximo
52
105
  end
53
106
 
54
- attr_accessor :mat
55
-
56
- def to_s()
57
- s="| "
58
- for i in (0... @mat.length)
59
- for j in (0... @mat.length)
60
- if j==0
61
- s += "{ "
62
- end
63
- s += "#{@mat[i][j]}\t"
64
- if j == @mat.length-1
65
- s += " } , "
66
- end
107
+ def min
108
+ minimo=@MAT[0].value
109
+ for i in (0...@m) do
110
+ if minimo > @MAT[i].value
111
+ minimo=@MAT[i].value
67
112
  end
68
113
  end
69
- s += "|"
70
- end
114
+ return minimo
115
+ end
71
116
 
72
- def print_matrix()
73
- printf "| "
74
- for i in (0... @mat.length)
75
- for j in (0... @mat.length)
76
- if j==0
77
- printf "{ "
117
+ def +(other)
118
+ if other.instance_of? SparseMatrix
119
+ o=DenseMatrix.new(@n,@m,Array.new(@n){Array.new(@m)})
120
+ for i in 0...@MAT.size
121
+ for j in 0...@MAT.size
122
+ o.mat[i][j]=self.valor(i,j)+other.valor(i,j)
78
123
  end
79
- printf "#{@mat[i][j]}\t"
80
- if j == @mat.length-1
81
- printf " } ,"
124
+ end
125
+ return SparseMatrix.new(@n,@m,o.mat) #SparseMatrix.new(@n,@m,o)
126
+ else
127
+ o=DenseMatrix.new(@n,@m,Array.new(@n){Array.new(@m)})
128
+ for i in 0...@n
129
+ for j in 0...@m
130
+ o.mat[i][j]=self.valor(i,j)+other.mat[i][j]
82
131
  end
83
132
  end
133
+ return o
84
134
  end
85
- printf "|"
86
135
  end
87
-
88
- def +(b)
136
+
137
+ def *(b)
138
+ if b.instance_of? SparseMatrix
89
139
  c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
90
- c.read_matrix
91
- for i in (0...@mat.length)
92
- for j in(0...@mat.length)
93
- c.mat[i][j] = self.mat[i][j]+b.mat[i][j]
140
+ for i in(0...@MAT.size)
141
+ for j in(0...@MAT.size)
142
+ c.mat[i][j]=0
143
+ for k in (0...@MAT.size)
144
+ c.mat[i][j] += self.valor(i,k)*b.valor(k,j)
145
+ end
94
146
  end
95
147
  end
96
148
  c
97
- end
98
-
99
- def *(b)
149
+ else
100
150
  c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
101
- c.read_matrix
102
- for i in(0...@mat.length)
103
- for j in(0...@mat.length)
151
+ for i in(0...@MAT.size)
152
+ for j in(0...@MAT.size)
104
153
  c.mat[i][j]=0
105
- for k in (0...@mat.length)
106
- c.mat[i][j] += @mat[i][k]*b.mat[k][j]
154
+ for k in (0...@MAT.size)
155
+ c.mat[i][j] += self.valor(i,k)*b.mat[k][j]
107
156
  end
108
157
  end
109
158
  end
@@ -111,107 +160,201 @@ module SparseMatrix
111
160
  end
112
161
  end
113
162
 
114
- class Fraction
115
- include Comparable
116
- def initialize (*args)
117
- if args.size == 2
118
- c = gcd(args[0],args[1])
119
- @num_ = (args[0]/c)
120
- @den_ = (args[1]/c)
121
- else
122
- @num_ = args[0]
123
- @den_ = 1
163
+ end
164
+
165
+
166
+ class DenseMatrix < AbstractMatrix
167
+ @mat
168
+ def initialize(r=0,c=0,matrix=[])
169
+ super(r,c)
170
+ @mat = matrix
171
+ end
172
+
173
+ attr_accessor :mat,:r,:c
174
+
175
+ def to_s()
176
+ s="| "
177
+ for i in (0... @mat.length)
178
+ for j in (0... @mat.length)
179
+ if j==0
180
+ s += "{ "
181
+ end
182
+ s += "#{@mat[i][j]}\t"
183
+ if j == @mat.length-1
184
+ s += " } , "
185
+ end
124
186
  end
125
187
  end
126
- attr_accessor :num_,:den_
127
-
128
- def to_s
129
- "#{@num_}/#{@den_}"
130
- end
131
- def to_f
132
- @num_.to_f/@den_.to_f
133
- end
134
-
135
- def ==(b)
136
- return @num_.eql?(b.num_) && @den_.eql?(b.den_)
137
- end
138
-
139
- def abs
140
- c = @num_.to_f/@den_.to_f
141
- return c.abs
142
- end
143
-
144
- def reciprocal
145
- f=Fraction.new
146
- f.num_=@den_
147
- f.den_ = @num_
148
- f
149
- end
150
-
151
- def -@
152
- Fraction.new(-@num_,@den_)
153
- end
154
-
155
- def +(b)
156
- r=Fraction.new
157
- if (@den_==b.den_)
158
- r.num_ = @num_ + b.num_
159
- r.den_ = @den_
160
- else
161
- r.num_ = @num_ * b.den_ + b.num_ * @den_
162
- r.den_ = @den_ * b.den_
188
+ s += "|"
189
+ end
190
+
191
+ def print_matrix()
192
+ printf "| "
193
+ for i in (0... @mat.length)
194
+ for j in (0... @mat.length)
195
+ if j==0
196
+ printf "{ "
197
+ end
198
+ printf "#{@mat[i][j]}\t"
199
+ if j == @mat.length-1
200
+ printf " } ,"
201
+ end
163
202
  end
164
- r.num_,r.den_ = minimiza(r.num_,r.den_)
165
- return r
166
203
  end
167
-
168
- def -(b)
169
- r =Fraction.new
170
- if (@den_ == b.den_)
171
- r.num_=@num_- b.num_
172
- r.den_=@den_
173
- else
174
- r.num_=@num_ * b.den_ - b.num_ * @den_
175
- r.den_ = @den_ * b.den_
204
+ printf "|"
205
+ end
206
+
207
+ def +(b)
208
+ c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
209
+ if b.instance_of? SparseMatrix
210
+ for i in (0...@mat.length)
211
+ for j in (0...@mat.size)
212
+ c.mat[i][j] = self.mat[i][j]+b.valor(i,j)
213
+ end
214
+ end
215
+ c
216
+ else
217
+ for i in (0...mat.length)
218
+ for j in (0...@mat.size)
219
+ c.mat[i][j] = self.mat[i][j]+b.mat[i][j]
220
+ end
221
+ end
222
+ c
223
+ end
224
+ end
225
+
226
+ def *(b)
227
+ if b.instance_of? SparseMatrix
228
+ c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
229
+ for i in(0...@mat.length)
230
+ for j in(0...@mat.length)
231
+ c.mat[i][j]=0
232
+ for k in (0...@mat.length)
233
+ c.mat[i][j] += @mat[i][k]*b.valor(k,j)
176
234
  end
177
- r.num_,r.den_ = minimiza(r.num_,r.den_)
178
- r
179
235
  end
180
-
181
- def *(b)
182
- r =Fraction.new
183
- r.num_=@num_ * b.num_
184
- r.den_=@den_ * b.den_
185
- r.num_,r.den_ = minimiza(r.num_,r.den_)
186
- return r
236
+ end
237
+ c
238
+ else
239
+ c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
240
+ for i in(0...@mat.length)
241
+ for j in(0...@mat.length)
242
+ c.mat[i][j]=0
243
+ for k in (0...@mat.length)
244
+ c.mat[i][j] += @mat[i][k]*b.mat[k][j]
245
+ end
187
246
  end
247
+ end
248
+ c
249
+ end
250
+ end
251
+ end
188
252
 
189
- def /(b)
190
- r =Fraction.new
191
- r.num_=@num_ / b.num_
192
- r.den_=@den_ * b.den_
193
- r.num_,r.den_ = minimiza(r.num_,r.den_)
194
- r
195
- end
196
-
197
- def <=>(b)
198
- self.to_f <=> b.to_f
199
- end
200
-
201
- def minimiza(x,y)
202
- d = gcd(x,y)
203
- x = x/d
204
- y = y/d
205
- return x,y
253
+ class Fraction
254
+ include Comparable
255
+ def initialize (*args)
256
+ if args.size == 2
257
+ c = gcd(args[0],args[1])
258
+ @num_ = (args[0]/c)
259
+ @den_ = (args[1]/c)
260
+ else
261
+ @num_ = args[0]
262
+ @den_ = 1
206
263
  end
207
264
  end
265
+ attr_accessor :num_,:den_
266
+
267
+ def to_s
268
+ "#{@num_}/#{@den_}"
269
+ end
270
+ def to_f
271
+ @num_.to_f/@den_.to_f
272
+ end
273
+
274
+ def ==(b)
275
+ return @num_.eql?(b.num_) && @den_.eql?(b.den_)
276
+ end
208
277
 
209
- def gcd(u, v)
210
- u, v = u.abs, v.abs
211
- while v != 0
212
- u, v = v, u % v
213
- end
214
- u
278
+ def abs
279
+ c = @num_.to_f/@den_.to_f
280
+ return c.abs
281
+ end
282
+
283
+ def reciprocal
284
+ f=Fraction.new
285
+ f.num_=@den_
286
+ f.den_ = @num_
287
+ f
288
+ end
289
+
290
+ def -@
291
+ Fraction.new(-@num_,@den_)
292
+ end
293
+
294
+ def +(b)
295
+ r=Fraction.new
296
+ if (@den_==b.den_)
297
+ r.num_ = @num_ + b.num_
298
+ r.den_ = @den_
299
+ else
300
+ r.num_ = @num_ * b.den_ + b.num_ * @den_
301
+ r.den_ = @den_ * b.den_
302
+ end
303
+ r.num_,r.den_ = minimiza(r.num_,r.den_)
304
+ return r
305
+ end
306
+
307
+ def -(b)
308
+ r =Fraction.new
309
+ if (@den_ == b.den_)
310
+ r.num_=@num_- b.num_
311
+ r.den_=@den_
312
+ else
313
+ r.num_=@num_ * b.den_ - b.num_ * @den_
314
+ r.den_ = @den_ * b.den_
315
+ end
316
+ r.num_,r.den_ = minimiza(r.num_,r.den_)
317
+ r
318
+ end
319
+
320
+ def *(b)
321
+ r =Fraction.new
322
+ r.num_=@num_ * b.num_
323
+ r.den_=@den_ * b.den_
324
+ r.num_,r.den_ = minimiza(r.num_,r.den_)
325
+ return r
326
+ end
327
+
328
+ def /(b)
329
+ r =Fraction.new
330
+ r.num_=@num_ / b.num_
331
+ r.den_=@den_ * b.den_
332
+ r.num_,r.den_ = minimiza(r.num_,r.den_)
333
+ r
334
+ end
335
+
336
+ def <=>(b)
337
+ self.to_f <=> b.to_f
338
+ end
339
+
340
+ def minimiza(x,y)
341
+ d = gcd(x,y)
342
+ x = x/d
343
+ y = y/d
344
+ return x,y
345
+ end
346
+
347
+ def coerce(other)
348
+ [self,other]
349
+ end
350
+ end
351
+
352
+ def gcd(u, v)
353
+ u, v = u.abs, v.abs
354
+ while v != 0
355
+ u, v = v, u % v
215
356
  end
357
+ u
358
+ end
216
359
 
217
360
  end
@@ -1,3 +1,3 @@
1
1
  module SparseMatrix
2
- VERSION = "1.0.0"
2
+ VERSION = "1.5.0"
3
3
  end
@@ -36,14 +36,90 @@ describe SparseMatrix do
36
36
  end
37
37
 
38
38
  describe SparseVector do
39
-
39
+ before :all do
40
+ SV = []
41
+ SVF = []
42
+ SV << SparseVector.new(1,2,3.0)
43
+ FRAC = Fraction.new(1,4)
44
+ SVF << SparseVector.new(1,1,FRAC)
45
+
46
+ end
47
+ describe "Basicas" do
48
+ it 'existe una clase sparse vector' do
49
+ SV.instance_of?(SparseVector) == true
50
+ end
51
+ it 'existen los getter y setter? (i)' do
52
+ SV[0].i.should == 1
53
+ end
54
+ it 'existen los getter y setter? (j)' do
55
+ SV[0].j.should == 2
56
+ end
57
+ it 'existen los getter y setter? (value)' do
58
+ SV[0].value.should == 3.0
59
+ end
60
+ end
61
+ describe "Configuracion y muestreo" do
62
+ it 'existe un metodo to_s' do
63
+ SV.should respond_to("to_s")
64
+ end
65
+ it 'se retorna correctamente un vector (sin Fraccion)' do
66
+ SV[0].to_s.should eq("1,2,3.0")
67
+ end
68
+ it 'se retorna correctamente un vector (con Fraccion)' do
69
+ SVF[0].to_s.should eq("1,1,1/4")
70
+ end
71
+ end
40
72
  end
41
73
 
42
74
  describe SparseMatrix do
43
-
75
+ before :all do
76
+ DM = DenseMatrix.new(2,2,[[1.0,2.0],[4.0,5.0]])
77
+ SM = SparseMatrix::SparseMatrix.new(2,2,[[2.0,0.0],[4.0,0.0]])
78
+ end
79
+ describe "Basicas" do
80
+ it 'existe una clase sparse Matrix' do
81
+ SM.instance_of?(SparseMatrix) == true
82
+ end
83
+ it 'Existe metodo insertar registro' do
84
+ SM.should respond_to("insert")
85
+ end
86
+ it 'Existe metodo to_s' do
87
+ SM.should respond_to("to_s")
88
+ end
89
+ end
90
+ describe "funcionalidades" do
91
+ it 'existe metodo maximo' do
92
+ SM.should respond_to("max")
93
+ end
94
+ it 'existe metodo minimo' do
95
+ SM.should respond_to("min")
96
+ end
97
+ it 'calcula el maximo correctamente' do
98
+ SM.max.should==4
99
+ end
100
+ it 'calcula el minimo correctamente' do
101
+ SM.min.should==2
102
+ end
103
+ it 'calcula la suma de matrices dispersa + densa' do
104
+ (SM+DM).to_s.should=="| { 3.0\t2.0\t } , { 8.0\t5.0\t } , |"
105
+ end
106
+ it 'calcula la suma de matrices densa + dispersa' do
107
+ (DM+SM).to_s.should=="| { 3.0\t2.0\t } , { 8.0\t5.0\t } , |"
108
+ end
109
+ it 'calcula la suma de matrices dispersa + dispersa' do
110
+ (SM+SM).to_s.should=="[4.0, 0][8.0, 0]"
111
+ end
112
+ it 'calcula la multiplicacion matrices dispersa * densa' do
113
+ (SM*DM).to_s.should=="| { 2.0\t4.0\t } , { 4.0\t8.0\t } , |"
114
+ end
115
+ it 'calcula la multiplicacion matrices densa * dispersa' do
116
+ (DM*SM).to_s.should=="| { 10.0\t0.0\t } , { 28.0\t0.0\t } , |"
117
+ end
118
+ it 'calcula la multiplicacion matrices dispersa * dispersa' do
119
+ (SM*SM).to_s.should=="| { 4.0\t0.0\t } , { 8.0\t0.0\t } , |"
120
+ end
44
121
  end
45
122
 
46
-
47
123
  describe DenseMatrix do
48
124
  before :all do
49
125
  DMA = DenseMatrix.new(2,2,[[1.0,2.0],[4.0,5.0]])
@@ -89,6 +165,7 @@ describe SparseMatrix do
89
165
  it 'multiplicar matrices, multiplica correctamente?' do
90
166
  (DMA*DMB).to_s.should eq("| { 7.0\t10.0\t } , { 19.0\t28.0\t } , |")
91
167
  end
168
+ end
92
169
  end
93
170
 
94
171
  describe Fraction do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparse_matrix
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - KevinRobayna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-20 00:00:00.000000000 Z
11
+ date: 2013-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler