lib/matrices_p9.rb in matrices_p9-0.0.1 vs lib/matrices_p9.rb in matrices_p9-1.0.0
- old
+ new
@@ -1,15 +1,23 @@
+require "matrices_p9/version"
require "fraccion.rb"
+#Clase abstracta de la que heredan matriz densa y dispersa. No se puede crear un objeto de esta clase.
class Matriz
-attr_accessor :fil, :col
+
+#Modulo para comparar
include Comparable
+#Numero de filas
+attr_accessor :fil
+
+#Numero de columnas
+attr_accessor :col
+ #Se almacena el valor de las filas y las columnas segun se le pasen por parametros.
def initialize(f, c)
- #atributo
- @fil=f.to_i; #Numero de filas
- @col=c.to_i; #Numero de columnas
+ @fil=f.to_i;
+ @col=c.to_i;
end
#Sobrecarga del operador de suma, recibe como parametros dos matrices y devuelve una matriz con el resultado de la suma de forma A+B= (Aij+Bij)
def +(other)
@@ -17,22 +25,31 @@
# SELF Matrices densas
if self.instance_of?MatrizDensa
temp = MatrizDensa.new(self.fil, self.col, nil)
if other.instance_of?MatrizDensa
- for i in (0...@fil.to_i)
- for j in (0...@col.to_i)
- temp.mat[i][j] = (self.mat[i][j]) + (other.mat[i][j])
+ #for i in (0...@fil.to_i)
+ @fil.to_i.times do |i|
+
+ #for j in (0...@col.to_i)
+ @col.to_i.times do |j|
+ temp.mat[i][j] = (@mat[i][j]) + (other.mat[i][j])
+
end
end
end
if other.instance_of?MatrizDispersa
- for i in (0...@fil.to_i)
- for j in (0...@col.to_i)
+ #for i in (0...@fil.to_i)
+ @fil.to_i.times do |i|
+
+ #for j in (0...@col.to_i)
+ @col.to_i.times do |j|
+
encontrado = 0
- for k in (0...other.posx.size)
+ #for k in (0...other.posx.size)
+ other.posx.size.times do |k|
if (i==other.posx[k] and j==other.posy[k] and encontrado==0)
temp.mat[i][j] = (self.mat[i][j]) + (other.valor[k])
encontrado = 1
end
end
@@ -46,14 +63,18 @@
# SELF Matriz Dispersa
if self.instance_of?MatrizDispersa
if other.instance_of?MatrizDensa
temp = MatrizDensa.new(self.fil, self.col, nil)
- for i in (0...@fil.to_i)
+ #for i in (0...@fil.to_i)
+ @fil.to_i.times do |i|
+
for j in (0...@col.to_i)
encontrado = 0
- for k in (0...self.posx.size.to_i)
+ #for k in (0...self.posx.size.to_i)
+ self.posx.size.times do |k|
+
if (i==self.posx[k] and j==self.posy[k] and encontrado==0)
temp.mat[i][j] = (other.mat[i][j]) + (self.valor[k])
encontrado = 1
end
end
@@ -69,13 +90,17 @@
temp = MatrizDispersa.new(self.fil,self.col,[],[],[])
temp.valor = self.valor
temp.posx = self.posx
temp.posy = self.posy
- for j in (0...other.posx.size.to_i)
+ #for j in (0...other.posx.size.to_i)
+ other.posx.size.to_i.times do |j|
+
encontrado = false
- for k in (0...self.posx.size.to_i)
+ #for k in (0...self.posx.size.to_i)
+ self.posx.size.times do |k|
+
if(other.posx[j] == temp.posx[k] and other.posy[j] == temp.posy[k])
temp.valor[k] = temp.valor[k] + other.valor[j]
encontrado = true
end
@@ -92,29 +117,40 @@
return temp
else
return nil
end
end
-
+ #Sobrecarga del operador de resta, recibe como parametros dos matrices y devuelve una matriz con el resultado de la suma de forma A-B= (Aij+Bij)
+
def -(other)
if(self.fil == other.fil and self.col == other.col)
# SELF Matrices densas
if self.instance_of?MatrizDensa
temp = MatrizDensa.new(self.fil, self.col, nil)
if other.instance_of?MatrizDensa
- for i in (0...@fil.to_i)
- for j in (0...@col.to_i)
+ #for i in (0...@fil.to_i)
+ @fil.to_i.times do |i|
+
+ #for j in (0...@col.to_i)
+ @col.to_i.times do |j|
+
temp.mat[i][j] = (self.mat[i][j]) - (other.mat[i][j])
end
end
end
if other.instance_of?MatrizDispersa
- for i in (0...@fil.to_i)
- for j in (0...@col.to_i)
+ #for i in (0...@fil.to_i)
+ @fil.to_i.times do |i|
+
+ #for j in (0...@col.to_i)
+ @col.to_i.times do |j|
+
encontrado = 0
- for k in (0...other.posx.size)
+ #for k in (0...other.posx.size)
+ other.posx.size.times do |k|
+
if (i==other.posx[k] and j==other.posy[k] and encontrado==0)
temp.mat[i][j] = (self.mat[i][j]) - (other.valor[k])
encontrado = 1
end
end
@@ -128,14 +164,20 @@
# SELF Matriz Dispersa
if self.instance_of?MatrizDispersa
if other.instance_of?MatrizDensa
temp = MatrizDensa.new(self.fil, self.col, nil)
- for i in (0...@fil.to_i)
- for j in (0...@col.to_i)
+ #for i in (0...@fil.to_i)
+ @fil.to_i.times do |i|
+
+ #for j in (0...@col.to_i)
+ @col.to_i.times do |j|
+
encontrado = 0
- for k in (0...self.posx.size.to_i)
+ #for k in (0...self.posx.size.to_i)
+ self.posx.size.times do |k|
+
if (i==self.posx[k] and j==self.posy[k] and encontrado==0)
temp.mat[i][j] = (other.mat[i][j]) - (self.valor[k])
encontrado = 1
end
end
@@ -151,13 +193,17 @@
temp = MatrizDispersa.new(self.fil,self.col,[],[],[])
temp.valor = self.valor
temp.posx = self.posx
temp.posy = self.posy
- for j in (0...other.posx.size.to_i)
+ #for j in (0...other.posx.size.to_i)
+ other.posx.size.times do |j|
+
encontrado = false
- for k in (0...self.posx.size.to_i)
+ #for k in (0...self.posx.size.to_i)
+ self.posx.size.times do |k|
+
if(other.posx[j] == temp.posx[k] and other.posy[j] == temp.posy[k])
temp.valor[k] = temp.valor[k] - other.valor[j]
encontrado = true
end
@@ -177,63 +223,70 @@
end
end
end
-
+#Clase que hereda de la clase matriz. Almacena matrices densas.
class MatrizDensa < Matriz
-attr_accessor :mat
- def initialize(f,c,e)
+#Array bidimensional que representa la matriz
+attr_accessor :mat
+ #crea una matriz con n filas, m columnas y almacena los valores que se le pasan por parámetros
+ def initialize(f,c,e)
+
super(f,c)
- @mat = Array.new(@fil.to_i){Array.new(@col.to_i)}
-
+ @mat = Array.new(@fil.to_i){Array.new(@col.to_i)} #k2
if (e != nil)
#Rellenamos la matriz con lo valores recibidos
for i in (0...@fil.to_i)
for j in (0...@col.to_i)
@mat[i][j]=e[i*@col.to_i+j];
end
end
end
end
- # Metodos getter devuelve el valor de una posicion determinada
-
+
+ # Metodo getter que devuelve el valor de una posicion determinada
def pos(a,b)
@mat[a][b]
end
#Metodo que devuelve la matriz en forma de string
def to_s
"#{@mat}"
end
-
+
+ #funcion que calcula el mayor valor que se encuentra en la matriz
def max
m = self.mat[0][0]
for i in (0...@fil.to_i)
- for j in (0...@col.to_i)
+ #for j in (0...@col.to_i)
+ @col.to_i.times do |j|
+
if (self.mat[i][j] > m)
m = self.mat[i][j]
end
end
end
return m
end
-
+
+ #funcion que calcula el menor valor que se encuentra en la matriz
def min
m = self.mat[0][0]
for i in (0...@fil.to_i)
- for j in (0...@col.to_i)
+ #for j in (0...@col.to_i)
+ @col.to_i.times do |j|
if (self.mat[i][j] < m)
m = self.mat[i][j]
end
end
end
return m
end
-#Operador de comparacion (Modulo comparable). se comparan por la suma de sus componentes ¡¡¡¡¡¡PONERLO EN LA CLASE MADRE!!!!!!
+#Operador de comparacion (Modulo comparable). se comparan por la suma de sus componentes.
def <=> (other)
return nil unless other.is_a?MatrizDensa
c1=0
c2=0
for i in (0...@fil.to_i)
@@ -250,50 +303,65 @@
end
+#Clase que hereda de la clase Matriz. Almacena matrices dispersas (matrices que la mayoria de sus posiciones son nulas 0)
class MatrizDispersa < Matriz
-attr_accessor :posx, :posy, :valor
+#Almacena las filas en que se encuentra algun valor
+attr_accessor :posx
+
+#Almacena las columnas en que se encuentra algun valor
+attr_accessor :posy
+
+#Almacena los valores correspondientes
+attr_accessor :valor
+
+
+
+# se recibe el valor de filas, columnas, los dos arrays con las posiciones en que hay valores y los valores correspondientes
def initialize(f,c,posx, posy, valor)
super(f,c)
@posx = posx
@posy = posy
@valor = valor
end
-
+
+ #Mdevuelve la matriz en forma de string
def to_s
s=String.new
s << "["
for i in (0...@fil.to_i)
s << "[#{posx[i]},#{posy[i]},#{valor[i]}]"
end
s << "]"
end
-
+
+ #devuelve el mayor valor almacenado en la matriz
def max
m = self.valor[0]
for i in (0...self.valor.size.to_i)
if (self.valor[i]> m)
m = self.valor[i]
end
end
return m
end
-
+
+ #devuelve el menor valor almacenado en la matriz
def min
m = self.valor[0]
for i in (0...self.valor.size.to_i)
if (self.valor[i]< m)
m = self.valor[i]
end
end
return m
end
-
+ #Retorna el valor correspondiente a las posiciones que se le pasen como parámetros
def pos(a,b)
for i in (0...self.posx.size)
if(posx[i]==a and posy[i]==b)
return valor[i]
end
@@ -302,11 +370,14 @@
end
end
-
-
+#|i,j, mat1,mat2| mat2[i][j] = (mat1[i][j]) + (mat2[i][j]) return mat2
+
+
+# f = Proc.new{|i,j, mat1, mat2| mat2[i][j] = (mat1[i][j]) + (mat2[i][j]) puts "#{mat2[i][j]}"}
+# f.call(1,1,[[1,2],[1,2]],[[1,2],[1,2]])