Class: ABAnalyzer::Matrix

Inherits:
Object
  • Object
show all
Defined in:
lib/abanalyzer/matrix.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(values) ⇒ Matrix

Returns a new instance of Matrix.



5
6
7
8
9
10
# File 'lib/abanalyzer/matrix.rb', line 5

def initialize(values)
  @values = values
  @columns = values.keys
  @rows = values[@columns.first].keys
  validate
end

Instance Attribute Details

#columnsObject (readonly)

Returns the value of attribute columns.



4
5
6
# File 'lib/abanalyzer/matrix.rb', line 4

def columns
  @columns
end

#rowsObject (readonly)

Returns the value of attribute rows.



4
5
6
# File 'lib/abanalyzer/matrix.rb', line 4

def rows
  @rows
end

Instance Method Details

#column_sum(name) ⇒ Object



45
46
47
# File 'lib/abanalyzer/matrix.rb', line 45

def column_sum(name)
  get_column(name).inject { |a,b| a+b }
end

#each_cellObject



33
34
35
36
37
38
39
# File 'lib/abanalyzer/matrix.rb', line 33

def each_cell
  @columns.each { |colname|
    @rows.each { |rowname|
      yield colname, rowname, get(colname, rowname)
    }
  }
end

#get(colname, rowname) ⇒ Object



41
42
43
# File 'lib/abanalyzer/matrix.rb', line 41

def get(colname, rowname)
  @values[colname][rowname]
end

#get_column(name) ⇒ Object



23
24
25
# File 'lib/abanalyzer/matrix.rb', line 23

def get_column(name)
  @values[name].values
end

#get_row(name) ⇒ Object



27
28
29
30
31
# File 'lib/abanalyzer/matrix.rb', line 27

def get_row(name)
  @values.map { |colname, rows|
    rows[name]
  }
end

#row_sum(name) ⇒ Object



49
50
51
# File 'lib/abanalyzer/matrix.rb', line 49

def row_sum(name)
  get_row(name).inject { |a,b| a+b }
end

#total_sumObject



53
54
55
# File 'lib/abanalyzer/matrix.rb', line 53

def total_sum
  @columns.map { |col| column_sum(col) }.inject { |a,b| a+b }      
end

#validateObject

Raises:



12
13
14
15
16
17
18
19
20
21
# File 'lib/abanalyzer/matrix.rb', line 12

def validate
  @values.each { |colname, column|
    if column.keys.map { |s| s.to_s }.sort != @rows.map { |s| s.to_s }.sort
      raise MatrixFormatError, "Column #{colname} has row names that don't match the first column's."
    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