class Math::DenseMatrix
Clase que permite representar matrices densas
Attributes
Public Class Methods
# File lib/matrix_disp.rb, line 306 def initialize(filas, columnas, v) @f = filas @c = columnas @m = [] i = 0 while i < @f*@c @m[i] = v[i] i=i+1 end end
Public Instance Methods
Método que permite la multiplicación de matrices densas mediante programación funcional
# File lib/matrix_disp.rb, line 337 def *(other) tmp = self.tras; a = tmp.to_v; d = other.to_v; i = -1; j = -1; k= -1; l= -1; ex = Array.new() a.map { |b| i+=1; k=-1; d.map { |e| k+=1; l=-1; e.map { |f| l+=1; a[i][l]*d[k][l] }.inject (0) { |s,p| s+p } } }.map{ |r| r.each { |t| ex.push(t) } } return DenseMatrix.new(@c,@f, ex) end
Método que permite la suma de matrices densas
# File lib/matrix_disp.rb, line 345 def +(other) i=-1 return DenseMatrix.new(@c,@f,other.m.map { |e| i+=1; e+@m[i]}) end
Método que permite la resta de matrices densas
# File lib/matrix_disp.rb, line 350 def -(other) i = 0 tmp = [] while i < @f*@c tmp[i] = @m[i]-other.m[i] i=i+1 end tmp end
Método que permite hacer la división de matrices densas
# File lib/matrix_disp.rb, line 474 def /(other1) a = Array.new(@f*@c, 0) resultado = DenseMatrix.new(@f, @c, a) other = other1.inv if @f*@c == other.c*other.f for i in (0...@c) do for j in (0...@f) do s = 0 for k in (0...@c) do s = s + (@m[i+(k*@c)] / other.m[k+(j*other.c)]) end resultado[i,j] = s end end else puts "Las matriz A debe tener el mismo numero de filas que las columnas de B" end resultado end
Método que permite la indexación de elementos de la matriz
# File lib/matrix_disp.rb, line 317 def [](a,b) @m[a+(b*@c)] end
Método que permite la asignación de elementos de la matriz
# File lib/matrix_disp.rb, line 321 def []=(a,b,r) @m[a+(b*@c)] = r end
Método que permite calcular la matriz adjunta de una matriz densa
# File lib/matrix_disp.rb, line 413 def adj() a = Array.new(@f*@c, 0) resultado = DenseMatrix.new(@f, @c, a) for i in (0...@c) do for j in (0...@f) do adj = [] z = 0 for x in (0...@c) do for y in (0...@f) do if (x != i) && (y != j) adj[z] = @m[x+(y*@c)] z=z+1 end end end if ((i+1)+(j+1))%2 == 0 resultado[i,j] = det(adj) else resultado[i,j] = -det(adj) end end end return resultado end
Método que permite calcular el determinante de una matriz densa. (Recursivo)
# File lib/matrix_disp.rb, line 360 def det(*other) resultado = 0 if other.size == 0 for i in (0...@c) do j = 0; adj = [] z = 0 for x in (0...@c) do for y in (0...@f) do if (x != i) && (y != j) adj[z] = @m[x+(y*@c)] z=z+1 end end end if ((i+1)+(j+1))%2 == 0 resultado = resultado + @m[i+(j*@c)]*det(adj) else resultado = resultado - @m[i+(j*@c)]*det(adj) end end else if other[0].size == 1 tmp = other[0] return tmp[0] else if other[0].size >= 4 for i in (0...Math.sqrt(other[0].size).to_i) do j=0 adj = [] z = 0 for x in (0...Math.sqrt(other[0].size).to_i) do for y in (0...Math.sqrt(other[0].size).to_i) do if (x != i) && (y != j) adj[z] = other[0][x+(y*Math.sqrt(other[0].size).to_i)] z=z+1 end end end if ((i+1)+(j+1))%2 == 0 tmp = other[0] resultado = resultado + tmp[i+(j*Math.sqrt(other[0].size).to_i)]*det(adj) else tmp = other[0] resultado = resultado - tmp[i+(j*Math.sqrt(other[0].size).to_i)]*det(adj) end end end end end return resultado end
método que permite mostrar por pantalla una matriz densa
# File lib/matrix_disp.rb, line 465 def imprimir for i in (0...@c*@f) do print "#{@m[i].round(2)}\t" if i % @c == 2 print "\n" end end end
Método que permite calcular la inversa de una matriz densa
# File lib/matrix_disp.rb, line 449 def inv determinante = self.det if determinante != 0 a = Array.new(@f*@c, 0) resultado = DenseMatrix.new(@f, @c, a) resultado = self.adj resultado = resultado.tras for i in (0...resultado.c) do for j in (0...resultado.f) do resultado[i,j] = (1/determinante.to_f)*resultado[i,j] end end return resultado end end
método que transforma la matriz en un vector de vectores. Devuelve un vector.
# File lib/matrix_disp.rb, line 325 def to_v v = [] for i in (0...@c) do tmp = [] for j in (0...@f) do tmp[j] = @m[i+(j*@c)] end v[i] = tmp end v end
Método que permite calcular la traspuesta de una matriz densa
# File lib/matrix_disp.rb, line 438 def tras() a = Array.new(@f*@c, 0) resultado = DenseMatrix.new(@f, @c, a) for i in (0...@c) do for j in (0...@f) do resultado[i,j] = @m[j+(i*@c)] end end return resultado end