kwyjibo 0.1.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 +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +8 -0
- data/Guardfile +38 -0
- data/LICENSE.txt +22 -0
- data/README.md +44 -0
- data/Rakefile +10 -0
- data/kwyjibo.gemspec +24 -0
- data/lib/kwyjibo.rb +305 -0
- data/lib/kwyjibo/version.rb +3 -0
- data/spec/kwyjibo_spec.rb +329 -0
- data/spec/spec_helper.rb +8 -0
- data/test/tc_kwyjibo.rb +97 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 886c37a69e3ad030b4be88e46b566dc2a10c6805
|
4
|
+
data.tar.gz: f6d6fc193642069fc4e8d2f7e108954996c5c4c9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a46b15539dd7e17be72a4154d5206b26d69569693364e9693e8fb73984cd9aeb5427afcceea212ddcaa7a841a0983139f9fc50110abe8798cb0729218507ae61
|
7
|
+
data.tar.gz: 31cd1b37c0c727e835b329b21b53382a8bff03a0ad4656a010d69fa7d5c2daada1c24f77172af5662340adb3c5adff1a6d4a8b2fe4a0ad221c33e3ed2076ad72
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
guard 'bundler' do
|
2
|
+
watch('Gemfile')
|
3
|
+
watch(/^.+\.gemspec/)
|
4
|
+
end
|
5
|
+
|
6
|
+
guard 'rspec', :version => 2 do
|
7
|
+
watch(%r{^spec/.+_spec\.rb$})
|
8
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
9
|
+
watch('spec/spec_helper.rb') { "spec" }
|
10
|
+
end
|
11
|
+
|
12
|
+
guard :bundler do
|
13
|
+
watch('Gemfile')
|
14
|
+
# Uncomment next line if your Gemfile contains the `gemspec' command.
|
15
|
+
# watch(/^.+\.gemspec/)
|
16
|
+
end
|
17
|
+
|
18
|
+
guard :rspec do
|
19
|
+
watch(%r{^spec/.+_spec\.rb$})
|
20
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
21
|
+
watch('spec/spec_helper.rb') { "spec" }
|
22
|
+
|
23
|
+
# Rails example
|
24
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
25
|
+
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
26
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
27
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
28
|
+
watch('config/routes.rb') { "spec/routing" }
|
29
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
30
|
+
|
31
|
+
# Capybara features specs
|
32
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
33
|
+
|
34
|
+
# Turnip features and steps
|
35
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
36
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
37
|
+
end
|
38
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 José Alberto
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Kwyjibo
|
2
|
+
|
3
|
+
Creating a Gem to represent Matrix and Sparse Matrix
|
4
|
+
|
5
|
+
## Class Inheritance
|
6
|
+
|
7
|
+
We have a first class called Matriz where all Matrix will be stored and a subclass called Dispersa to represent a Sparse Matrix
|
8
|
+
|
9
|
+
## Status
|
10
|
+
|
11
|
+
[](https://travis-ci.org/alu0100537291/kwyjibo)
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
Add this line to your application's Gemfile:
|
16
|
+
|
17
|
+
gem 'kwyjibo'
|
18
|
+
|
19
|
+
And then execute:
|
20
|
+
|
21
|
+
$ bundle
|
22
|
+
|
23
|
+
Or install it yourself as:
|
24
|
+
|
25
|
+
$ gem install kwyjibo
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
Gem under construction!
|
30
|
+
|
31
|
+
## Contributing
|
32
|
+
|
33
|
+
1. Fork it
|
34
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
35
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
36
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
37
|
+
5. Create new Pull Request
|
38
|
+
|
39
|
+
## Authors
|
40
|
+
|
41
|
+
| ALUMNO | CORREO|
|
42
|
+
| -------- | ------- |
|
43
|
+
| José Alberto Pérez Melián | alu0100537291[AT]ull.edu.es |
|
44
|
+
| Jéssica Alejandra Ramos Villarreal | alu0100537338[AT]ull.edu.es |
|
data/Rakefile
ADDED
data/kwyjibo.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'kwyjibo/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "kwyjibo"
|
8
|
+
spec.version = Kwyjibo::VERSION
|
9
|
+
spec.authors = ["José Alberto"]
|
10
|
+
spec.email = ["japmelian@gmail.com"]
|
11
|
+
spec.description = %q{CoAuthor: Jéssica Alejandra Ramos Villarreal}
|
12
|
+
spec.summary = %q{LPP - Práctica 9}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency 'rspec', '~> 2.9'
|
24
|
+
end
|
data/lib/kwyjibo.rb
ADDED
@@ -0,0 +1,305 @@
|
|
1
|
+
require "kwyjibo/version"
|
2
|
+
|
3
|
+
module Kwyjibo
|
4
|
+
class Matrix
|
5
|
+
attr_reader :rows, :cols
|
6
|
+
|
7
|
+
def initialize(rows,cols)
|
8
|
+
@rows, @cols = rows, cols
|
9
|
+
end
|
10
|
+
|
11
|
+
def +(other)
|
12
|
+
raise ArgumentError, "Matrix size must be equal" unless @rows == other.rows && @cols == other.cols
|
13
|
+
c = DenseMatrix.new(@rows, @cols)
|
14
|
+
@rows.times do |i|
|
15
|
+
@cols.times do |j|
|
16
|
+
if self[i][j] == nil && other[i][j] == nil
|
17
|
+
c[i][j] = 0
|
18
|
+
elsif self[i][j] == nil && other[i][j] != nil
|
19
|
+
c[i][j] = other[i][j]
|
20
|
+
elsif self[i][j] != nil && other[i][j] == nil
|
21
|
+
c[i][j] = self[i][j]
|
22
|
+
else
|
23
|
+
c[i][j] = self[i][j] + other[i][j]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
c
|
28
|
+
end
|
29
|
+
|
30
|
+
def -(other)
|
31
|
+
raise ArgumentError, "Matrix size must be equal" unless @rows == other.rows && @cols == other.cols
|
32
|
+
c = DenseMatrix.new(@rows, @cols)
|
33
|
+
@rows.times do |i|
|
34
|
+
@cols.times do |j|
|
35
|
+
if self[i][j] == nil && other[i][j] == nil
|
36
|
+
c[i][j] = 0
|
37
|
+
elsif self[i][j] == nil && other[i][j] != nil
|
38
|
+
c[i][j] = -other[i][j]
|
39
|
+
elsif self[i][j] != nil && other[i][j] == nil
|
40
|
+
c[i][j] = self[i][j]
|
41
|
+
else
|
42
|
+
c[i][j] = self[i][j] - other[i][j]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
c
|
47
|
+
end
|
48
|
+
|
49
|
+
def *(other)
|
50
|
+
raise ArgumentError, "Columns and Rows must be equal" unless (@cols == other.rows)
|
51
|
+
c = DenseMatrix.new(@rows,other.cols)
|
52
|
+
@rows.times do |i|
|
53
|
+
other.cols.times do |j|
|
54
|
+
ac = 0
|
55
|
+
@cols.times do |k|
|
56
|
+
ac += self[i][k] * other[k][j] if (self[i][k] != nil && other[k][j] != nil)
|
57
|
+
end
|
58
|
+
c[i][j] = ac
|
59
|
+
end
|
60
|
+
end
|
61
|
+
c
|
62
|
+
end
|
63
|
+
|
64
|
+
def max
|
65
|
+
encontrado = false
|
66
|
+
value = 0
|
67
|
+
i = -1
|
68
|
+
|
69
|
+
while encontrado == false
|
70
|
+
i += 1
|
71
|
+
j = 0
|
72
|
+
while j < self.cols
|
73
|
+
if self[i][j] != nil and value == 0
|
74
|
+
value = self[i][j]
|
75
|
+
encontrado = true
|
76
|
+
break
|
77
|
+
else
|
78
|
+
j += 1
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
@rows.times do |i|
|
84
|
+
@cols.times do |j|
|
85
|
+
if self[i][j] != nil && self[i][j] > value
|
86
|
+
value = self[i][j]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
value
|
91
|
+
end
|
92
|
+
|
93
|
+
def min
|
94
|
+
encontrado = false
|
95
|
+
value = 0
|
96
|
+
i = -1
|
97
|
+
|
98
|
+
while encontrado == false
|
99
|
+
i += 1
|
100
|
+
j = 0
|
101
|
+
while j < self.cols
|
102
|
+
if self[i][j] != nil and value == 0
|
103
|
+
value = self[i][j]
|
104
|
+
encontrado = true
|
105
|
+
break
|
106
|
+
else
|
107
|
+
j += 1
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
@rows.times do |i|
|
113
|
+
@cols.times do |j|
|
114
|
+
if self[i][j] != nil && self[i][j] < value
|
115
|
+
value = self[i][j]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
value
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class DenseMatrix < Matrix
|
124
|
+
attr_reader :data
|
125
|
+
|
126
|
+
def initialize(rows,cols)
|
127
|
+
@data = Array.new(rows) {Array.new(cols)}
|
128
|
+
super
|
129
|
+
end
|
130
|
+
|
131
|
+
def [](i)
|
132
|
+
@data[i]
|
133
|
+
end
|
134
|
+
|
135
|
+
def []=(i,value)
|
136
|
+
@data[i] = value
|
137
|
+
end
|
138
|
+
|
139
|
+
def tras()
|
140
|
+
c = DenseMatrix.new(@cols, @rows)
|
141
|
+
c.rows.times do |i|
|
142
|
+
c.cols.times do |j|
|
143
|
+
c[i][j] = self[j][i]
|
144
|
+
end
|
145
|
+
end
|
146
|
+
c
|
147
|
+
end
|
148
|
+
|
149
|
+
def x(value)
|
150
|
+
self.rows.times do |i|
|
151
|
+
self.cols.times do |j|
|
152
|
+
self[i][j] *= 2
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
class SparseVector
|
159
|
+
attr_reader :vector
|
160
|
+
|
161
|
+
def initialize(h = {})
|
162
|
+
@vector = Hash.new(0)
|
163
|
+
@vector = @vector.merge!(h)
|
164
|
+
end
|
165
|
+
|
166
|
+
def [](i)
|
167
|
+
@vector[i]
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
class SparseMatrix < Matrix
|
172
|
+
attr_reader :data
|
173
|
+
|
174
|
+
def initialize(rows,cols, h = {})
|
175
|
+
@data = Hash.new({})
|
176
|
+
for k in h.keys do
|
177
|
+
if h[k].is_a? SparseVector
|
178
|
+
@data[k] = h[k]
|
179
|
+
else
|
180
|
+
@data[k] = SparseVector.new(h[k])
|
181
|
+
end
|
182
|
+
end
|
183
|
+
super(rows,cols)
|
184
|
+
end
|
185
|
+
|
186
|
+
def [](i)
|
187
|
+
@data[i]
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
class Fraccion
|
192
|
+
include Comparable
|
193
|
+
|
194
|
+
attr_accessor :num, :denom
|
195
|
+
|
196
|
+
def initialize(a, b)
|
197
|
+
x = mcd(a,b)
|
198
|
+
@num = a/x
|
199
|
+
@denom = b/x
|
200
|
+
|
201
|
+
if (@num < 0 && @denom < 0)
|
202
|
+
@num = @num * -1
|
203
|
+
@denom = @denom * -1
|
204
|
+
end
|
205
|
+
|
206
|
+
if (@denom < 0)
|
207
|
+
@denom = @denom * -1
|
208
|
+
@num = @num * -1
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def mcd(u, v)
|
213
|
+
u, v = u.abs, v.abs
|
214
|
+
while v != 0
|
215
|
+
u, v = v, u % v
|
216
|
+
end
|
217
|
+
u
|
218
|
+
end
|
219
|
+
|
220
|
+
def to_s
|
221
|
+
"#{@num}/#{@denom}"
|
222
|
+
end
|
223
|
+
|
224
|
+
def to_f
|
225
|
+
@num.to_f/@denom.to_f
|
226
|
+
end
|
227
|
+
|
228
|
+
def +(other)
|
229
|
+
if other.instance_of? Fixnum
|
230
|
+
c = Fraccion.new(other,1)
|
231
|
+
Fraccion.new(@num * c.denom + @denom * c.num, @denom * c.denom)
|
232
|
+
else
|
233
|
+
Fraccion.new(@num * other.denom + @denom * other.num, @denom * other.denom)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def -(other)
|
238
|
+
if other.instance_of? Fixnum
|
239
|
+
c = Fraccion.new(other,1)
|
240
|
+
Fraccion.new(@num * c.denom - @denom * c.num, @denom * c.denom)
|
241
|
+
else
|
242
|
+
Fraccion.new(@num * other.denom - @denom * other.num, @denom * other.denom)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def *(other)
|
247
|
+
if other.instance_of? Fixnum
|
248
|
+
c = Fraccion.new(other,1)
|
249
|
+
Fraccion.new(@num * c.num, @denom * c.denom)
|
250
|
+
else
|
251
|
+
Fraccion.new(@num * other.num, @denom * other.denom)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def /(other)
|
256
|
+
if other.instance_of? Fixnum
|
257
|
+
c = Fraccion.new(other,1)
|
258
|
+
Fraccion.new(@num * c.denom, @denom * c.num)
|
259
|
+
else
|
260
|
+
Fraccion.new(@num * other.denom, @denom * other.num)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def %(other)
|
265
|
+
if other.instance_of? Fixnum
|
266
|
+
c = Fraccion.new(other,1)
|
267
|
+
division = Fraccion.new(@num * c.denom, @denom * c.num)
|
268
|
+
else
|
269
|
+
division = Fraccion.new(@num * other.denom, @denom * other.num)
|
270
|
+
end
|
271
|
+
division.num % division.denom
|
272
|
+
end
|
273
|
+
|
274
|
+
def abs
|
275
|
+
@num = @num.abs
|
276
|
+
@denom = @denom.abs
|
277
|
+
end
|
278
|
+
|
279
|
+
def reciprocal
|
280
|
+
x = @num
|
281
|
+
@num = @denom
|
282
|
+
@denom = x
|
283
|
+
end
|
284
|
+
|
285
|
+
def -@
|
286
|
+
if (@num > 0)
|
287
|
+
@num = @num * -1
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
def <=>(other)
|
292
|
+
return nil unless (other.instance_of? Fraccion) || (other.instance_of? Fixnum)
|
293
|
+
if other.instance_of? Fixnum
|
294
|
+
c = Fraccion.new(other,1)
|
295
|
+
(c.num.to_f/c.denom.to_f) <=> (self.num.to_f/self.denom.to_f)
|
296
|
+
else
|
297
|
+
(self.num.to_f/self.denom.to_f) <=> (other.num.to_f/other.denom.to_f)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
def coerce(other)
|
302
|
+
[self,other]
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
@@ -0,0 +1,329 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Kwyjibo do
|
4
|
+
before :each do
|
5
|
+
@a = Kwyjibo::DenseMatrix.new(2,2)
|
6
|
+
@a[0][0] = Kwyjibo::Fraccion.new(1,1)
|
7
|
+
@a[0][1] = Kwyjibo::Fraccion.new(2,1)
|
8
|
+
@a[1][0] = Kwyjibo::Fraccion.new(3,1)
|
9
|
+
@a[1][1] = 4
|
10
|
+
|
11
|
+
@b = Kwyjibo::SparseMatrix.new(2,2,0 => { 0 => 1, 1 => 2})
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "\n # Matrix data \n" do
|
15
|
+
it "### Una matriz densa tiene su numero de filas almacenadas" do
|
16
|
+
@a.rows.should eq(2)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "### Una matriz densa tiene su numero de columnas almacenadas" do
|
20
|
+
@a.cols.should eq(2)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "### Una matriz dispersa tiene su numero de filas almacenadas" do
|
24
|
+
@b.rows.should eq(2)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "### Una matriz dispersa tiene su numero de columnas almacenadas" do
|
28
|
+
@b.cols.should eq(2)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "\n # Operaciones con matrices densas" do
|
33
|
+
describe "\n ## Suma de matrices densas \n" do
|
34
|
+
it "### Se pueden sumar matrices del mismo tamano" do
|
35
|
+
c = Kwyjibo::DenseMatrix.new(2,2)
|
36
|
+
|
37
|
+
c[0][0] = 1
|
38
|
+
c[0][1] = 2
|
39
|
+
c[1][0] = 3
|
40
|
+
c[1][1] = 4
|
41
|
+
|
42
|
+
d = @a + c
|
43
|
+
|
44
|
+
d[0][0].should eq(2)
|
45
|
+
d[0][1].should eq(4)
|
46
|
+
d[1][0].should eq(6)
|
47
|
+
d[1][1].should eq(8)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "### No se pueden sumar matrices de distinto tamano" do
|
51
|
+
c = Kwyjibo::DenseMatrix.new(2,1)
|
52
|
+
|
53
|
+
c[0][0] = 1
|
54
|
+
c[1][0] = 3
|
55
|
+
|
56
|
+
expect {@a + c}.to raise_error(ArgumentError)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "### El resultado de sumar dos matrices densas debe ser una matriz densa" do
|
60
|
+
c = Kwyjibo::DenseMatrix.new(2,2)
|
61
|
+
|
62
|
+
c[0][0] = 1
|
63
|
+
c[0][1] = 2
|
64
|
+
c[1][0] = 3
|
65
|
+
c[1][1] = 4
|
66
|
+
|
67
|
+
d = @a + c
|
68
|
+
|
69
|
+
d.should be_an_instance_of Kwyjibo::DenseMatrix
|
70
|
+
end
|
71
|
+
|
72
|
+
it "### La suma de dos matrices densas debe dar una matriz densa del mismo tamano" do
|
73
|
+
c = Kwyjibo::DenseMatrix.new(2,2)
|
74
|
+
|
75
|
+
c[0][0] = 1
|
76
|
+
c[0][1] = 2
|
77
|
+
c[1][0] = 3
|
78
|
+
c[1][1] = 4
|
79
|
+
|
80
|
+
d = @a + c
|
81
|
+
|
82
|
+
d.rows.should eq(2)
|
83
|
+
d.cols.should eq(2)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "\n ## Resta de matrices densas \n" do
|
88
|
+
it "### Se pueden restar matrices del mismo tamano" do
|
89
|
+
c = Kwyjibo::DenseMatrix.new(2,2)
|
90
|
+
|
91
|
+
c[0][0] = Kwyjibo::Fraccion.new(1,1)
|
92
|
+
c[0][1] = Kwyjibo::Fraccion.new(2,1)
|
93
|
+
c[1][0] = Kwyjibo::Fraccion.new(3,1)
|
94
|
+
c[1][1] = Kwyjibo::Fraccion.new(4,1)
|
95
|
+
|
96
|
+
d = @a - c
|
97
|
+
|
98
|
+
d[0][0].should eq(Kwyjibo::Fraccion.new(0,1))
|
99
|
+
d[0][1].should eq(Kwyjibo::Fraccion.new(0,1))
|
100
|
+
d[1][0].should eq(Kwyjibo::Fraccion.new(0,1))
|
101
|
+
d[1][1].should eq(Kwyjibo::Fraccion.new(0,1))
|
102
|
+
end
|
103
|
+
|
104
|
+
it "### No se pueden restar matrices de distinto tamano" do
|
105
|
+
c = Kwyjibo::DenseMatrix.new(2,1)
|
106
|
+
|
107
|
+
c[0][0] = Kwyjibo::Fraccion.new(1,1)
|
108
|
+
c[1][0] = Kwyjibo::Fraccion.new(3,1)
|
109
|
+
|
110
|
+
expect {@a - c}.to raise_error(ArgumentError)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "### El resultado de restar dos matrices densas debe ser una matriz densa" do
|
114
|
+
c = Kwyjibo::DenseMatrix.new(2,2)
|
115
|
+
|
116
|
+
c[0][0] = 1
|
117
|
+
c[0][1] = 2
|
118
|
+
c[1][0] = 3
|
119
|
+
c[1][1] = 4
|
120
|
+
|
121
|
+
d = @a - c
|
122
|
+
|
123
|
+
d.should be_an_instance_of Kwyjibo::DenseMatrix
|
124
|
+
end
|
125
|
+
|
126
|
+
it "### La resta de dos matrices debe dar una matriz del mismo tamano" do
|
127
|
+
c = Kwyjibo::DenseMatrix.new(2,2)
|
128
|
+
|
129
|
+
c[0][0] = 1
|
130
|
+
c[0][1] = 2
|
131
|
+
c[1][0] = 3
|
132
|
+
c[1][1] = 4
|
133
|
+
|
134
|
+
d = @a - c
|
135
|
+
|
136
|
+
d.rows.should eq(2)
|
137
|
+
d.cols.should eq(2)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "\n ## Multiplicacion de matrices densas \n" do
|
142
|
+
it "### Se pueden multiplicar dos matrices si el numero de columnas de la primera es igual al numero de de la segunda matriz" do
|
143
|
+
c = Kwyjibo::DenseMatrix.new(2,5)
|
144
|
+
|
145
|
+
c[0][0] = Kwyjibo::Fraccion.new(1,1)
|
146
|
+
c[0][1] = Kwyjibo::Fraccion.new(2,1)
|
147
|
+
c[0][2] = Kwyjibo::Fraccion.new(3,1)
|
148
|
+
c[0][3] = Kwyjibo::Fraccion.new(4,1)
|
149
|
+
c[0][4] = Kwyjibo::Fraccion.new(5,1)
|
150
|
+
c[1][0] = Kwyjibo::Fraccion.new(6,1)
|
151
|
+
c[1][1] = Kwyjibo::Fraccion.new(7,1)
|
152
|
+
c[1][2] = Kwyjibo::Fraccion.new(8,1)
|
153
|
+
c[1][3] = Kwyjibo::Fraccion.new(9,1)
|
154
|
+
c[1][4] = Kwyjibo::Fraccion.new(10,1)
|
155
|
+
|
156
|
+
d = @a * c
|
157
|
+
|
158
|
+
d[0][0].should eq(Kwyjibo::Fraccion.new(13,1))
|
159
|
+
d[0][1].should eq(Kwyjibo::Fraccion.new(16,1))
|
160
|
+
d[0][2].should eq(Kwyjibo::Fraccion.new(19,1))
|
161
|
+
d[0][3].should eq(Kwyjibo::Fraccion.new(22,1))
|
162
|
+
d[0][4].should eq(Kwyjibo::Fraccion.new(25,1))
|
163
|
+
d[1][0].should eq(Kwyjibo::Fraccion.new(27,1))
|
164
|
+
d[1][1].should eq(Kwyjibo::Fraccion.new(34,1))
|
165
|
+
d[1][2].should eq(Kwyjibo::Fraccion.new(41,1))
|
166
|
+
d[1][3].should eq(Kwyjibo::Fraccion.new(48,1))
|
167
|
+
d[1][4].should eq(Kwyjibo::Fraccion.new(55,1))
|
168
|
+
end
|
169
|
+
|
170
|
+
it "### No se pueden multiplicar dos matrices si el numero de columnas de la primera es distinto al numero de de la segunda matriz" do
|
171
|
+
c = Kwyjibo::DenseMatrix.new(1,2)
|
172
|
+
|
173
|
+
c[0][0] = 1
|
174
|
+
c[0][1] = Kwyjibo::Fraccion.new(2,1)
|
175
|
+
|
176
|
+
expect {@a * c}.to raise_error(ArgumentError)
|
177
|
+
end
|
178
|
+
|
179
|
+
it "### El resultado de multiplicar dos matrices debe ser una matriz con numero de filas igual a las filas de la primera matriz y numero de columnas igual al numero de columnas de la segunda matriz" do
|
180
|
+
c = Kwyjibo::DenseMatrix.new(2,5)
|
181
|
+
|
182
|
+
c[0][0] = Kwyjibo::Fraccion.new(1,1)
|
183
|
+
c[0][1] = Kwyjibo::Fraccion.new(2,1)
|
184
|
+
c[0][2] = Kwyjibo::Fraccion.new(3,1)
|
185
|
+
c[0][3] = Kwyjibo::Fraccion.new(4,1)
|
186
|
+
c[0][4] = Kwyjibo::Fraccion.new(5,1)
|
187
|
+
c[1][0] = Kwyjibo::Fraccion.new(6,1)
|
188
|
+
c[1][1] = Kwyjibo::Fraccion.new(7,1)
|
189
|
+
c[1][2] = Kwyjibo::Fraccion.new(8,1)
|
190
|
+
c[1][3] = Kwyjibo::Fraccion.new(9,1)
|
191
|
+
c[1][4] = Kwyjibo::Fraccion.new(10,1)
|
192
|
+
|
193
|
+
d = @a * c
|
194
|
+
|
195
|
+
d.rows.should eq(2)
|
196
|
+
d.cols.should eq(5)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe "\n ##Operaciones entre matrices densas y escalares \n" do
|
201
|
+
it "### Se puede multiplicar una matriz densa por un escalar" do
|
202
|
+
@a.x(2)
|
203
|
+
|
204
|
+
@a[0][0].should eq(2)
|
205
|
+
@a[0][1].should eq(4)
|
206
|
+
@a[1][0].should eq(6)
|
207
|
+
@a[1][1].should eq(8)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "\n ## Opuesta de una matriz densa \n" do
|
212
|
+
it "### Se puede calcular la opuesta de una matriz densa" do
|
213
|
+
c = @a.tras
|
214
|
+
|
215
|
+
c[0][0].should eq(1)
|
216
|
+
c[0][1].should eq(3)
|
217
|
+
c[1][0].should eq(2)
|
218
|
+
c[1][1].should eq(4)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "### En el calculo de la matriz opuesta de una matriz se intercambian sus filas y columnas" do
|
222
|
+
c = Kwyjibo::DenseMatrix.new(2,5)
|
223
|
+
|
224
|
+
c[0][0] = Kwyjibo::Fraccion.new(1,1)
|
225
|
+
c[0][1] = Kwyjibo::Fraccion.new(2,1)
|
226
|
+
c[0][2] = Kwyjibo::Fraccion.new(3,1)
|
227
|
+
c[0][3] = Kwyjibo::Fraccion.new(4,1)
|
228
|
+
c[0][4] = Kwyjibo::Fraccion.new(5,1)
|
229
|
+
c[1][0] = Kwyjibo::Fraccion.new(6,1)
|
230
|
+
c[1][1] = Kwyjibo::Fraccion.new(7,1)
|
231
|
+
c[1][2] = Kwyjibo::Fraccion.new(8,1)
|
232
|
+
c[1][3] = Kwyjibo::Fraccion.new(9,1)
|
233
|
+
c[1][4] = Kwyjibo::Fraccion.new(10,1)
|
234
|
+
|
235
|
+
d = c.tras
|
236
|
+
|
237
|
+
d.rows.should eq(5)
|
238
|
+
d.cols.should eq(2)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
describe "\n # Calculo de valores maximos y minimos en una matriz \n" do
|
244
|
+
it "### Se puede calcular el valor maximo de los elementos de una matriz" do
|
245
|
+
@a.max.should eq(4)
|
246
|
+
end
|
247
|
+
|
248
|
+
it "### Se puede calcular el valor minimo de los elementos de una matriz" do
|
249
|
+
@a.min.should eq(1)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
describe "\n # Operaciones con matrices dispersas \n" do
|
254
|
+
it "### Sumar dos matrices dispersas" do
|
255
|
+
q = Kwyjibo::SparseMatrix.new(2,2,0 => { 0 => 1, 1 => 2}, 1 => { 0 => 3, 1 => 4})
|
256
|
+
w = Kwyjibo::SparseMatrix.new(2,2,0 => { 0 => 1, 1 => 2}, 1 => { 0 => 3, 1 => 4})
|
257
|
+
|
258
|
+
c = q + w
|
259
|
+
|
260
|
+
c[0][0].should eq(2)
|
261
|
+
c[0][1].should eq(4)
|
262
|
+
c[1][0].should eq(6)
|
263
|
+
c[1][1].should eq(8)
|
264
|
+
end
|
265
|
+
|
266
|
+
it "### Sumar una matriz densa y otra dispersa" do
|
267
|
+
q = Kwyjibo::SparseMatrix.new(2,2,0 => { 0 => 1, 1 => 2}, 1 => { 0 => 3, 1 => 4})
|
268
|
+
|
269
|
+
c = @a + q
|
270
|
+
|
271
|
+
c[0][0].should eq(2)
|
272
|
+
c[0][1].should eq(4)
|
273
|
+
c[1][0].should eq(6)
|
274
|
+
c[1][1].should eq(8)
|
275
|
+
end
|
276
|
+
|
277
|
+
it "### Sumar una matriz dispersa y otra densa" do
|
278
|
+
q = Kwyjibo::SparseMatrix.new(2,2,0 => { 0 => 1, 1 => 2}, 1 => { 0 => 3, 1 => 4})
|
279
|
+
|
280
|
+
c = q + @a
|
281
|
+
|
282
|
+
c[0][0].should eq(2)
|
283
|
+
c[0][1].should eq(4)
|
284
|
+
c[1][0].should eq(6)
|
285
|
+
c[1][1].should eq(8)
|
286
|
+
end
|
287
|
+
|
288
|
+
it "### Multiplicacion de una matriz dispersa por una densa" do
|
289
|
+
q = Kwyjibo::SparseMatrix.new(2,2,0 => { 0 => Kwyjibo::Fraccion.new(5,1), 1 => 6})
|
290
|
+
|
291
|
+
c = @a * q
|
292
|
+
|
293
|
+
c[0][0].should eq(5)
|
294
|
+
c[0][1].should eq(6)
|
295
|
+
c[1][0].should eq(15)
|
296
|
+
c[1][1].should eq(Kwyjibo::Fraccion.new(18,1))
|
297
|
+
end
|
298
|
+
|
299
|
+
it "### El resultado de multiplicar dos matrices debe ser una matriz con numero de filas igual a las filas de la primera matriz y numero de columnas igual al numero de columnas de la segunda matriz" do
|
300
|
+
q = Kwyjibo::SparseMatrix.new(2,2,0 => { 0 => Kwyjibo::Fraccion.new(5,1), 1 => 6})
|
301
|
+
|
302
|
+
c = @a * q
|
303
|
+
|
304
|
+
c.rows.should eq(2)
|
305
|
+
c.cols.should eq(2)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
describe "\n # EXPECTATIVA A CUMPLIR \n" do
|
310
|
+
it "Suma de una matriz densa y una matriz dispersa" do
|
311
|
+
f = Kwyjibo::DenseMatrix.new(2,2)
|
312
|
+
f[0][0] = 2
|
313
|
+
f[0][1] = 1
|
314
|
+
f[1][0] = -5
|
315
|
+
f[1][1] = Kwyjibo::Fraccion.new(-3,2)
|
316
|
+
|
317
|
+
g = Kwyjibo::SparseMatrix.new(2,2, 1 => {1 => 1})
|
318
|
+
|
319
|
+
h = f + g
|
320
|
+
|
321
|
+
h.rows.should eq(2)
|
322
|
+
h.cols.should eq(2)
|
323
|
+
h[0][0].should eq(2)
|
324
|
+
h[0][1].should eq(1)
|
325
|
+
h[1][0].should eq(-5)
|
326
|
+
h[1][1].should eq(Kwyjibo::Fraccion.new(-1,2))
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/test/tc_kwyjibo.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'kwyjibo'
|
3
|
+
|
4
|
+
class Test_Kwyjibo < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@a = Kwyjibo::DenseMatrix.new(2,2)
|
7
|
+
@a[0][0] = Kwyjibo::Fraccion.new(1,1)
|
8
|
+
@a[0][1] = Kwyjibo::Fraccion.new(2,1)
|
9
|
+
@a[1][0] = Kwyjibo::Fraccion.new(3,1)
|
10
|
+
@a[1][1] = 4
|
11
|
+
|
12
|
+
@b = Kwyjibo::DenseMatrix.new(2,2)
|
13
|
+
@b[0][0] = Kwyjibo::Fraccion.new(5,1)
|
14
|
+
@b[0][1] = Kwyjibo::Fraccion.new(6,1)
|
15
|
+
@b[1][0] = 7
|
16
|
+
@b[1][1] = 8
|
17
|
+
|
18
|
+
@c = Kwyjibo::SparseMatrix.new(2,3,0 => { 0 => Kwyjibo::Fraccion.new(5,1), 1 => 6})
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_rows
|
22
|
+
assert_equal(2,@a.rows)
|
23
|
+
assert_equal(2,@b.rows)
|
24
|
+
assert_not_equal(3,@a.rows)
|
25
|
+
assert_not_equal(3,@b.rows)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_cols
|
29
|
+
assert_equal(2,@a.cols)
|
30
|
+
assert_equal(2,@b.cols)
|
31
|
+
assert_not_equal(3,@a.cols)
|
32
|
+
assert_not_equal(3,@b.cols)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_values
|
36
|
+
assert_equal(Kwyjibo::Fraccion.new(1,1),@a[0][0])
|
37
|
+
assert_equal(Kwyjibo::Fraccion.new(2,1),@a[0][1])
|
38
|
+
assert_equal(3,@a[1][0])
|
39
|
+
assert_equal(4,@a[1][1])
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_plus
|
43
|
+
d = @a + @b
|
44
|
+
assert_equal(2,d.rows)
|
45
|
+
assert_equal(2,d.cols)
|
46
|
+
assert_equal(6,d[0][0])
|
47
|
+
assert_equal(8,d[0][1])
|
48
|
+
assert_equal(10,d[1][0])
|
49
|
+
assert_equal(Kwyjibo::Fraccion.new(12,1),d[1][1])
|
50
|
+
|
51
|
+
assert_raise(ArgumentError) {@a + @c}
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_minus
|
55
|
+
d = @a - @b
|
56
|
+
assert_equal(2,d.rows)
|
57
|
+
assert_equal(2,d.cols)
|
58
|
+
assert_equal(-4,d[0][0])
|
59
|
+
assert_equal(-4,d[0][1])
|
60
|
+
assert_equal(-4,d[1][0])
|
61
|
+
assert_equal(Kwyjibo::Fraccion.new(4,-1),d[1][1])
|
62
|
+
|
63
|
+
assert_raise(ArgumentError) {@a - @c}
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_product
|
67
|
+
d = @a * @c
|
68
|
+
assert_equal(2,d.rows)
|
69
|
+
assert_equal(3,d.cols)
|
70
|
+
assert_equal(5,d[0][0])
|
71
|
+
assert_equal(6,d[0][1])
|
72
|
+
assert_equal(0,d[0][2])
|
73
|
+
assert_equal(15,d[1][0])
|
74
|
+
assert_equal(18,d[1][1])
|
75
|
+
assert_equal(0,d[1][2])
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_traspose
|
79
|
+
d = @a.tras
|
80
|
+
assert_equal(2,d.cols)
|
81
|
+
assert_equal(2,d.rows)
|
82
|
+
assert_equal(1,d[0][0])
|
83
|
+
assert_equal(3,d[0][1])
|
84
|
+
assert_equal(2,d[1][0])
|
85
|
+
assert_equal(4,d[1][1])
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_max
|
89
|
+
assert_equal(4,@a.max)
|
90
|
+
assert_equal(6,@c.max)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_min
|
94
|
+
assert_equal(Kwyjibo::Fraccion.new(1,1),@a.min)
|
95
|
+
assert_equal(Kwyjibo::Fraccion.new(0,1),@c.min)
|
96
|
+
end
|
97
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kwyjibo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- José Alberto
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-11-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.9'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.9'
|
55
|
+
description: 'CoAuthor: Jéssica Alejandra Ramos Villarreal'
|
56
|
+
email:
|
57
|
+
- japmelian@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- .rspec
|
64
|
+
- .travis.yml
|
65
|
+
- Gemfile
|
66
|
+
- Guardfile
|
67
|
+
- LICENSE.txt
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- kwyjibo.gemspec
|
71
|
+
- lib/kwyjibo.rb
|
72
|
+
- lib/kwyjibo/version.rb
|
73
|
+
- spec/kwyjibo_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
75
|
+
- test/tc_kwyjibo.rb
|
76
|
+
homepage: ''
|
77
|
+
licenses:
|
78
|
+
- MIT
|
79
|
+
metadata: {}
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options: []
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 2.1.11
|
97
|
+
signing_key:
|
98
|
+
specification_version: 4
|
99
|
+
summary: LPP - Práctica 9
|
100
|
+
test_files:
|
101
|
+
- spec/kwyjibo_spec.rb
|
102
|
+
- spec/spec_helper.rb
|
103
|
+
- test/tc_kwyjibo.rb
|