class RMatrix::MatrixTable

Public Class Methods

new(matrix, max_columns: 10, max_rows: 10) click to toggle source
Calls superclass method
# File lib/rmatrix/printing/matrix_table.rb, line 5
def initialize(matrix, max_columns: 10, max_rows: 10)
  super()
  column_offset, row_offset = 0, 0
  column_labels = !!matrix.column_label_map
  row_labels    = !!matrix.row_label_map

  printed_rows = [matrix.rows, max_rows].min
  printed_columns = [matrix.columns, max_columns].min

  if matrix.column_label_map
    printed_columns.times do |i|
      column_label = matrix.column_label_map[i]
      if column_label
        self[i+1 + (row_labels ? 1 : 0 ), 0] = column_label.inspect
      end
    end
    row_offset += 1
  end

  if matrix.row_label_map
    printed_rows.times do |i|
      row_label = matrix.row_label_map[i]
      if row_label
        self[0, i + (column_labels ?  1 : 0)] = row_label.inspect
      end
    end
    column_offset += 1
  end


  self[column_offset,row_offset] = "#{matrix.is_vector? ? 'V' : 'M'}["
  column_offset += 1
  matrix.each_row.with_index do |row, row_idx|
    break if row_idx > printed_rows
    row.each.with_index do |cell, column_idx|
      break if column_idx > printed_columns
      self[column_idx + column_offset, row_idx + row_offset] = cell
    end
    self[[matrix.columns + column_offset, printed_columns + column_offset + 1].min, row_idx + row_offset] = ',' if (row_idx + row_offset - 1) != printed_rows
  end

  column_overlap = matrix.columns > max_columns
  row_overlap    = matrix.rows    > max_rows
  both_overlap   = column_overlap && row_overlap

  if column_overlap
    printed_rows.times do |row|
      self[max_columns + column_offset - 1, row + row_offset] = '…'
      self[max_columns + column_offset, row + row_offset] = matrix.raw[row, -1]
    end
  end

  if row_overlap
    printed_columns.times do |column|
      self[column + column_offset, max_rows + row_offset - 1] = '⋮'
      self[column + column_offset, max_rows + row_offset] = matrix.raw[-1, column]
    end
  end

  if both_overlap
    self[printed_columns + column_offset - 1, printed_rows + row_offset - 1] = "⋱"
    self[printed_columns + column_offset - 1, printed_rows + row_offset] = '⋮'
    self[printed_columns + column_offset, printed_rows + row_offset - 1] = '…'
    self[printed_columns + column_offset, printed_rows + row_offset]     = matrix.raw[-1, -1]
  end

  self[self.column_count - 1, self.row_count - 1] = ']'

  if row_labels
    self.set_column_separator( 0, ' ')
    self.set_column_separator( 1, '[')
    self.set_column_separator(self.column_count - 1, ']')
  else
    self.set_column_separator( 0, '[')
    self.set_column_separator(self.column_count - 2, ']')
  end

  self.set_column_separator(self.column_count - 2, ']')
end