lib/SparseMatrixProject.rb in SparseMatrixProject-0.0.1 vs lib/SparseMatrixProject.rb in SparseMatrixProject-0.0.2
- old
+ new
@@ -1,60 +1,68 @@
require "SparseMatrixProject/version"
-require "racional.rb"
module SparseMatrixProject
class Matrices
include Comparable
include Enumerable
attr_accessor :filas, :columnas, :matriz
- def initialize(f, c)
+ def initialize(f, c)#Crea la matriz con las dimensiones especificadas
#atributo
@filas=f.to_i; #Numero de filas
@columnas=c.to_i; #Numero de columnas
end
-#################################################
- def +(other)
+
+ def +(other)#Método suma para matrices densas y dispersas
if(self.filas == other.filas and self.columnas == other.columnas)
# SELF Matrices densas
if self.instance_of?Densa
temp = Densa.new(self.filas, self.columnas, nil)
if other.instance_of?Densa
- for i in (0...@filas.to_i)
- for j in (0...@columnas.to_i)
- temp.matriz[i][j] = (self.matriz[i][j]) + (other.matriz[i][j])
- end
+ 0.upto(@filas-1) do |i| #for i in (0...@filas.to_i)
+ ##0.upto(@columnas-1) do |j| #for j in (0...@columnas.to_i)
+ j=0
+ (0..(@columnas-1)).collect {
+ temp.matriz[i][j] = (self.matriz[i][j]) + (other.matriz[i][j])
+ j+=1;
+ ##end
+ }
end
end
if other.instance_of?Dispersa
- for i in (0...@filas.to_i)
- for j in (0...@columnas.to_i)
+
+ 0.upto(@filas-1) do |i| ## for i in (0...@filas.to_i)
+
+ j=0
+ (0..(@columnas-1)).collect { ##for j in (0...@columnas.to_i)
encontrado = 0
for k in (0...other.posx.size)
if (i==other.posx[k] and j==other.posy[k] and encontrado==0)
temp.matriz[i][j] = (self.matriz[i][j]) + (other.valor[k])
encontrado = 1
end
end
if (encontrado == 0)
temp.matriz[i][j] = self.matriz[i][j]
end
- end
+ j+= 1
+ }
+ ##end
end
end
end
# SELF Matriz Dispersa
if self.instance_of?Dispersa
if other.instance_of?Densa
temp = Densa.new(self.filas, self.columnas, nil)
- for i in (0...@filas.to_i)
- for j in (0...@columnas.to_i)
+ 0.upto(@filas-1) do |i| ##for i in (0...@filas.to_i)
+ 0.upto(@columnas-1) do |j|##for j in (0...@columnas.to_i)
encontrado = 0
for k in (0...self.posx.size.to_i)
if (i==self.posx[k] and j==self.posy[k] and encontrado==0)
temp.matriz[i][j] = (other.matriz[i][j]) + (self.valor[k])
encontrado = 1
@@ -93,18 +101,135 @@
end
return temp
else
return nil
- end
-
- end
-##############################################################################
+
+end
+end
+
+def *(other) #Método producto para matrices densas y dispersas
+ temp=Densa.new(self.filas,other.columnas,nil)
+
+ # SELF Matrices densas
+ if self.instance_of?Densa
+ if other.instance_of?Densa
+ ###########################DENSA*DENSA#####################################
+ self.filas.times do |i|
+ other.columnas.times do |j|
+ temp.matriz[i][j]=0
+ other.columnas.times do |k|
+ temp.matriz[i][j] = temp.matriz[i][j] + (self.matriz[i][k] * other.matriz[k][j])
+ end
+ end
+ end
+ end
+ if other.instance_of?Dispersa
+ disptodens = Densa.new(self.filas,other.columnas,[0,0,0,0,0,0,0,0,0])
+
+ @filas.times do |i|
+ @columnas.times do |j|
+ encontrado = 0
+ 0.upto(other.posx.size) do |k|
+ if (i==other.posx[k] and j==other.posy[k] and encontrado==0)
+ disptodens.matriz[i][j] = other.valor[k]
+ end
+ end
+ end
+ end
+ #puts disptodens.to_s
+
+ self.filas.times do |i|
+ disptodens.columnas.times do |j|
+ temp.matriz[i][j]=0
+ disptodens.columnas.times do |k|
+ temp.matriz[i][j] = temp.matriz[i][j] + (self.matriz[i][k] * disptodens.matriz[k][j])
+ end
+ end
+ end
+ end
+ end
+
+
+ if self.instance_of?Dispersa
+ if other.instance_of?Dispersa
+ ###########################DISPERSA*DISPERSA#####################################
+ ##1 dispersa a densa
+ disptodens = Densa.new(self.filas,other.columnas,[0,0,0,0,0,0,0,0,0])
+ @filas.times do |i|
+ @columnas.times do |j|
+ encontrado = 0
+ 0.upto(other.posx.size) do |k|
+ if (i==other.posx[k] and j==other.posy[k] and encontrado==0)
+ disptodens.matriz[i][j] = other.valor[k]
+ end
+ end
+ end
+ end
+
+ ##2 dispersa a densa
+ disptodens2 = Densa.new(other.filas,self.columnas,[0,0,0,0,0,0,0,0,0])
+ @filas.times do |i|
+ @columnas.times do |j|
+ encontrado = 0
+ 0.upto(self.posx.size) do |k|
+ if (i==self.posx[k] and j==self.posy[k] and encontrado==0)
+ disptodens2.matriz[i][j] = self.valor[k]
+ end
+ end
+ end
+ end
+
+
+ temp=Densa.new(self.filas, self.columnas,[0,0,0,0,0,0,0,0,0])
+ puts disptodens.to_s####################################################################
+ puts disptodens2.to_s###################################################################
+ disptodens.filas.times do |i|
+ disptodens2.columnas.times do |j|
+ temp.matriz[i][j]=0
+ disptodens2.columnas.times do |k|
+ temp.matriz[i][j] = temp.matriz[i][j] + (disptodens2.matriz[i][k] * disptodens.matriz[k][j])
+ end
+ end
+ end
+ end
+
+ if other.instance_of?Densa
+ ###########################DISPERSA*DENSA#####################################
+ disptodens = Densa.new(other.filas,self.columnas,[0,0,0,0,0,0,0,0,0])
+ @filas.times do |i|
+ @columnas.times do |j|
+ encontrado = 0
+ 0.upto(self.posx.size) do |k|
+ if (i==self.posx[k] and j==self.posy[k] and encontrado==0)
+ disptodens.matriz[i][j] = self.valor[k]
+ end
+ end
+ end
+ end
+
+ #puts disptodens.to_s
+
+ #puts other.to_s
+
+ temp=Densa.new(self.filas, self.columnas,[0,0,0,0,0,0,0,0,0])
+ other.filas.times do |i|
+ other.columnas.times do |j|
+ disptodens.columnas.times do |k|
+ temp.matriz[i][j] = temp.matriz[i][j] + (disptodens.matriz[i][k] * other.matriz[k][j])
+ end
+ end
+ end
+ end
+ end
+ temp
+end
+
##############################RESTA###########################################
-def -(other)
+def -(other) #Resta de matrices Densas y Dispersas##
if(self.filas == other.filas and self.columnas == other.columnas)
# SELF Matrices densas
if self.instance_of?Densa
temp = Densa.new(self.filas, self.columnas, nil)
if other.instance_of?Densa
@@ -184,12 +309,19 @@
end
end
end
-
-
+# === Clase Dispersa
+#
+# Definición de la clase _Dispersa_ compuesta por
+# * metodo initialize
+# * metodo to_s(other)
+# * metodo max(other)
+# * metodo min(other)
+# * método pos
+#
class Dispersa < Matrices
attr_accessor :posx, :posy, :valor
def initialize(f,c,posx, posy, valor)
super(f,c)
@posx = posx
@@ -235,16 +367,23 @@
end
return nil
end
end
-
-
+# === Clase Densa
+#
+# Definición de la clase _Matrices_ compuesta por
+# * metodo initialize
+# * metodo pos(a,b)
+# * metodo to_s
+# * metodo max
+# * metodo min
+#
class Densa < Matrices
attr_accessor :matriz
-def initialize(f,c,m)
+def initialize(f,c,m)#Estructura de datos de la matriz densa
super(f,c)
@matriz = Array.new(@filas.to_i){Array.new(@columnas.to_i)}
if (m != nil)
#Rellenamos la matriz con lo valores recibidos
@@ -253,25 +392,23 @@
@matriz[i][j]=m[i*@columnas.to_i+j];
end
end
end
end
- # Metodos getter devuelve el valor de una posicion determinada
+
- def pos(a,b)
+ def pos(a,b)# Metodos getter devuelve el valor de una posicion determinada
@matriz[a][b]
end
- #Metodo que devuelve la matriz en forma de string
- def to_s
+
+ def to_s#Metodo que devuelve la matriz en forma de string
"#{@matriz}"
end
-
-####Traspuesta de una matriz
- def traspuesta
+ def traspuesta#Método que calcula la traspuesta de una matriz
i=0
mtrasp = Array.new(@filas) {Array.new(self.columnas)}
while i < @filas
j=0
while j < @columnas
@@ -282,13 +419,13 @@
end
Matrices.new(mtrasp)
end
-####Opuesta de una matriz
- def opuesta
+ def opuesta#Método que calcula el opuesto de una matriz
+
i=0
mop = Array.new(@filas) {Array.new(self.columnas)}
while i < @filas
j=0
while j < @columnas
@@ -299,12 +436,11 @@
end
Matrices.new(mop)
end
-############Método Mínimo######################################
- def minimo
+ def minimo#Método que devuelve el elemento menor de la matriz
min = self.matriz[0][0]
i=0
while i < @filas
j=0
@@ -317,12 +453,11 @@
i+= 1
end
return min
end
-##############Método Máximo######################################
- def maximo
+ def maximo#Método que devuelve el elemento mayor de la matriz
max = self.matriz[0][0]
i = 0
while i < @filas
j = 0
@@ -334,7 +469,6 @@
end
i+= 1
end
return max
end
-end
-end
+endend