class MatrizDispersa
Attributes
columnas[RW]
modificar el initialize,pues no necesito almacenar los ‘0’ guardar los indices donde se encuentran dichos ceros metodo que dado una fila y columna y un porcentaje de ceros prc,construye una matriz aleatoria
filas[RW]
modificar el initialize,pues no necesito almacenar los ‘0’ guardar los indices donde se encuentran dichos ceros metodo que dado una fila y columna y un porcentaje de ceros prc,construye una matriz aleatoria
hash_no_ceros[RW]
modificar el initialize,pues no necesito almacenar los ‘0’ guardar los indices donde se encuentran dichos ceros metodo que dado una fila y columna y un porcentaje de ceros prc,construye una matriz aleatoria
Public Class Methods
new(matriz)
click to toggle source
# File lib/matriz.rb, line 180 def initialize(matriz) @filas = matriz.size @columnas = matriz[0].size @hash_no_ceros={} #comprobamos que la matriz es dispersa o no @n_elementos= (matriz.size * matriz[0].size)*0.6 n_ceros=0 filas.times do |i| columnas.times do |j| if (matriz[i][j]==0) n_ceros=n_ceros+1 else pos_no_cero="#{i}#{j}" @hash_no_ceros[pos_no_cero]=matriz[i][j] end end end if n_ceros < @n_elementos raise RuntimeError, 'La Matriz no es dispersa' else end end
Public Instance Methods
+(other)
click to toggle source
# File lib/matriz.rb, line 230 def +(other) raise TypeError, "La matriz other no es dispersa" unless other.instance_of? MatrizDispersa raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas suma=MatrizDispersa.new(Array.new(@filas,0){Array.new(@columnas,0)}) suma.hash_no_ceros = (hash_no_ceros.merge(other.hash_no_ceros){|key,oldval,newval| oldval+newval}).clone if comprobar(suma.hash_no_ceros) return suma else m = Array.new(@filas,0){Array.new(@columnas,0)} suma.hash_no_ceros.each {|key, value| m[(key[0]).to_i][(key[1]).to_i] = value } sum = MatrizDensa.new(m) return sum end end
-(other)
click to toggle source
# File lib/matriz.rb, line 247 def -(other) raise TypeError, "La matriz other no es dispersa" unless other.instance_of? MatrizDispersa raise ArgumentError, "La longitud de las matrices no coincide." unless @filas == other.filas && @columnas == other.columnas resta=MatrizDispersa.new(Array.new(@filas,0){Array.new(@columnas,0)}) resta.hash_no_ceros = (self.hash_no_ceros.merge(other.hash_no_ceros){|key,oldval,newval| oldval-0-newval}).clone if comprobar(resta.hash_no_ceros) return resta else puts resta.hash_no_ceros m = Array.new(@filas,0){Array.new(@columnas,0)} resta.hash_no_ceros.each {|key, value| m[(key[0]).to_i][(key[1]).to_i] = value } res = MatrizDensa.new(m) return res end end
==(other)
click to toggle source
# File lib/matriz.rb, line 263 def ==(other) hash_no_ceros == other.hash_no_ceros end
comprobar(hash)
click to toggle source
# File lib/matriz.rb, line 207 def comprobar (hash) if hash.length > ((@filas * @columnas)*0.4) false else true end end
to_s()
click to toggle source
# File lib/matriz.rb, line 215 def to_s filas.times do |i| columnas.times do |j| if (hash_no_ceros.key?("#{i}#{j}")) print hash_no_ceros["#{i}#{j}"] print " " else print "0 " end end puts end end