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]])