class ABAnalyzer::Matrix

Attributes

columns[R]
rows[R]

Public Class Methods

new(values) click to toggle source
# File lib/abanalyzer/matrix.rb, line 4
def initialize(values)
  @values = values
  @columns = values.keys
  @rows = values[@columns.first].keys
  validate
end

Public Instance Methods

column_sum(name) click to toggle source
# File lib/abanalyzer/matrix.rb, line 44
def column_sum(name)
  get_column(name).inject { |a, b| a + b }
end
each_cell() { |colname, rowname, get(colname, rowname)| ... } click to toggle source
# File lib/abanalyzer/matrix.rb, line 32
def each_cell
  @columns.each do |colname|
    @rows.each do |rowname|
      yield colname, rowname, get(colname, rowname)
    end
  end
end
get(colname, rowname) click to toggle source
# File lib/abanalyzer/matrix.rb, line 40
def get(colname, rowname)
  @values[colname][rowname]
end
get_column(name) click to toggle source
# File lib/abanalyzer/matrix.rb, line 22
def get_column(name)
  @values[name].values
end
get_row(name) click to toggle source
# File lib/abanalyzer/matrix.rb, line 26
def get_row(name)
  @values.map do |_colname, rows|
    rows[name]
  end
end
row_sum(name) click to toggle source
# File lib/abanalyzer/matrix.rb, line 48
def row_sum(name)
  get_row(name).inject { |a, b| a + b }
end
total_sum() click to toggle source
# File lib/abanalyzer/matrix.rb, line 52
def total_sum
  @columns.map { |col| column_sum(col) }.inject { |a, b| a + b }
end
validate() click to toggle source
# File lib/abanalyzer/matrix.rb, line 11
def validate
  @values.each do |colname, column|
    if column.keys.map(&:to_s).sort != @rows.map(&:to_s).sort
      raise MatrixFormatError, "Column #{colname} has row names that don't match the first column's."
    end
  end
  coltotal = @columns.map { |col| column_sum(col) }.inject { |a, b| a + b }
  rowtotal = @rows.map { |col| row_sum(col) }.inject { |a, b| a + b }
  raise MatrixFormatError, 'Column sums do not equal row sums' if coltotal != rowtotal
end