class Matrix

Monkey patching the Matrix class to implement matrix splicing.

Public Instance Methods

[](i, j) click to toggle source
# File lib/rubyml.rb, line 9
def [](i, j)
  if i.class == Fixnum && j == ':'
    row(i)
  elsif j.class == Fixnum && i == ':'
    column(j)
  else
    redirect(i, j)
  end
end
redirect(i, j) click to toggle source
# File lib/rubyml.rb, line 19
def redirect(i, j)
  if i.class == String && j.class == String
    redirect2(i, j)
  else
    old_element(i, j)
  end
end
redirect2(i, j) click to toggle source
# File lib/rubyml.rb, line 27
def redirect2(i, j)
  if i.include?(':') || j.include?(':')
    redirect3(i, j)
  else
    old_element(i, j)
  end
end
redirect3(i, j) click to toggle source
# File lib/rubyml.rb, line 35
def redirect3(i, j)
  rs, re = i.split(':').map { |e| e == '' ? 0 : Integer(e) }
  cs, ce = j.split(':').map { |e| e == '' ? 0 : Integer(e) }
  redirect4(rs, re, cs, ce, [i, j])
end
redirect4(rs, re, cs, ce, orig) click to toggle source
# File lib/rubyml.rb, line 41
def redirect4(rs, re, cs, ce, orig)
  if orig[0] == ':'
    rs = 0
    re = row_count
  end
  if orig[1] == ':'
    cs = 0
    ce = column_count
  end
  redirect5(rs, re, cs, ce, orig)
end
redirect5(rs, re, cs, ce, orig) click to toggle source
# File lib/rubyml.rb, line 53
def redirect5(rs, re, cs, ce, orig)
  re = rs + 1 unless orig[0].include?(':')
  ce = cs + 1 unless orig[1].include?(':')
  redirect6(rs, re, cs, ce)
end
redirect6(rs, re, cs, ce) click to toggle source
# File lib/rubyml.rb, line 59
def redirect6(rs, re, cs, ce)
  rs = rs.nil? ? 0 : rs
  cs = cs.nil? ? 0 : cs
  re = re.nil? ? row_count : re
  ce = ce.nil? ? column_count : ce
  redirect7(rs, re, cs, ce)
end
redirect7(rs, re, cs, ce) click to toggle source
# File lib/rubyml.rb, line 67
def redirect7(rs, re, cs, ce)
  return Matrix.rows([]) if rs >= re && cs >= ce
  return Matrix.rows([[]] * (re - rs)) if cs == ce
  return Matrix.columns([[]] * (ce - cs)) if re == rs
  redirect8(rs, re, cs, ce)
end
redirect8(rs, re, cs, ce) click to toggle source
# File lib/rubyml.rb, line 74
def redirect8(rs, re, cs, ce)
  rv = row_vectors[rs..re - 1].map(&:to_a)
  nrv = rv.map { |e| e[cs..ce - 1] }
  Matrix.rows(nrv)
end