class Math::DenseMatrix

Clase que permite representar matrices densas

Attributes

c[RW]
f[RW]
m[RW]

Public Class Methods

new(filas, columnas, v) click to toggle source
# 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

*(other) click to toggle source

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
+(other) click to toggle source

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
-(other) click to toggle source

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
/(other1) click to toggle source

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
[](a,b) click to toggle source

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
[]=(a,b,r) click to toggle source

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
adj() click to toggle source

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
det(*other) click to toggle source

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
imprimir() click to toggle source

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
inv() click to toggle source

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
to_v() click to toggle source

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
tras() click to toggle source

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