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