sparse_matrix 1.0.0 → 1.5.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
  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