class Matrixlpp::Matriz

Esta clase contendrá el número de filas y columnas de la matriz.

Attributes

M[R]

Número de columnas.

N[R]

Número de filas.

contenido[R]

Vector que contendrá los datos de la matriz.

Public Class Methods

new(n, m) click to toggle source

Constructor de la matriz. Crea una matriz de tamaño N*M sin contenido, inicializando sólo N y M.

  • Argumentos    :

    • n: Número de filas. Debe ser mayor que 0.

    • m: Número de columnas. Debe ser mayor que 0.

# File lib/matrixlpp/matriz.rb, line 17
def initialize(n, m)
  raise ArgumentError, 'Indice no valido' unless n.is_a? Fixnum and n > 0 and m.is_a? Fixnum and m > 0

  @N, @M = n, m
end

Public Instance Methods

*(other) click to toggle source

Permite multiplicar un elemento a una matriz.

# File lib/matrixlpp/matriz_operaciones.rb, line 56
def *(other)
  raise ArgumentError , 'Parametro invalido' unless other.is_a? Numeric or other.is_a? Matriz

  if(other.is_a? Numeric) # Matriz * numero
    c = Matriz_Densa.new(@N, @M)
    
    (@N).times do |i|
      (@M).times do |j|
        c.set(i, j, get(i,j)*other)
      end
    end
  else # Matriz * Matriz
    raise ArgumentError , 'Matriz no compatible (A.N == B.M)' unless @M == other.N
    c = Matriz_Densa.new(@N, other.M)
    
    (@N).times do |i|
      (other.M).times do |j|
        buffer = (0...@M).inject(0) { |acc, k| get(i, k) * other.get(k,j) + acc }
        c.set(i, j, buffer)
        #(@M).times do |k|
          # Esto NO es programación funcional...
          # c.set(i, j, get(i, k) * other.get(k,j) + c.get(i,j))
        #end
      end
    end
  end

  if (c.null_percent > 0.6)
    return Matrixlpp::Matriz_Dispersa.copy(c)
  else
    return c
  end
end
+(other) click to toggle source

Permite sumar matrices (dispersas o densas) de iguales dimensiones.

  • Argumentos    :

    • other: Matriz densa o dispersa. Debe ser de igual tamaño que la actual.

  • Devuelve    :

    • Matriz de tamaño N*M resultado de la suma de la matriz actual con other. Si el porcentaje de valores nulos es mayor al 60%, se devuelve una matriz dispersa. Si no, se devuelve una matriz densa.

# File lib/matrixlpp/matriz_operaciones.rb, line 12
def +(other)
  raise ArgumentError , 'Tipo invalido' unless other.is_a? Matriz
  raise ArgumentError , 'Matriz no compatible' unless @N == other.N and @M == other.M
  c = Matriz_Densa.new(@N, @M)
  
  #(0...@N).each do |i|
    #(0...@M).each do |j|
  (@N).times do |i|
    (@M).times do |j|
      c.set(i, j, get(i,j) + other.get(i,j))
    end
  end
  
  if (c.null_percent > 0.6)
    return Matrixlpp::Matriz_Dispersa.copy(c)
  else
    return c
  end 
end
-(other) click to toggle source

Permite restar matrices (dispersas o densas) de iguales dimensiones.

  • Argumentos    :

    • other: Matriz densa o dispersa. Debe ser de igual tamaño que la actual.

  • Devuelve    :

    • Matriz de tamaño N*M resultado de la resta de la matriz actual con other. Si el porcentaje de valores nulos es mayor al 60%, se devuelve una matriz dispersa. Si no, se devuelve una matriz densa.

# File lib/matrixlpp/matriz_operaciones.rb, line 37
def -(other)
  raise ArgumentError , 'Tipo invalido' unless other.is_a? Matriz
  raise ArgumentError , 'Matriz no compatible' unless @N == other.N and @M == other.M
  c = Matriz_Densa.new(@N, @M)
  
  (@N).times do |i|
    (@M).times do |j|
      c.set(i, j, get(i,j) - other.get(i,j))
    end
  end
  
  if (c.null_percent > 0.6)
    return Matrixlpp::Matriz_Dispersa.copy(c)
  else
    return c
  end 
end
get(i, j) click to toggle source

Método que permite acceder a un elemento de la matriz. Devuelve nil. Redefinido en clases hijas.

# File lib/matrixlpp/matriz.rb, line 24
def get(i, j)
  nil
end
set(i, j, val) click to toggle source

Método que permite almacenar un elemento en la matriz. Devuelve nil. Redefinido en clases hijas.

# File lib/matrixlpp/matriz.rb, line 28
def set(i, j, val)
  nil
end