Class: ABAnalyzer::Matrix
- Inherits:
-
Object
- Object
- ABAnalyzer::Matrix
- Defined in:
- lib/abanalyzer/matrix.rb
Instance Attribute Summary collapse
-
#columns ⇒ Object
readonly
Returns the value of attribute columns.
-
#rows ⇒ Object
readonly
Returns the value of attribute rows.
Instance Method Summary collapse
- #column_sum(name) ⇒ Object
- #each_cell ⇒ Object
- #get(colname, rowname) ⇒ Object
- #get_column(name) ⇒ Object
- #get_row(name) ⇒ Object
-
#initialize(values) ⇒ Matrix
constructor
A new instance of Matrix.
- #row_sum(name) ⇒ Object
- #total_sum ⇒ Object
- #validate ⇒ Object
Constructor Details
#initialize(values) ⇒ Matrix
Returns a new instance of Matrix.
4 5 6 7 8 9 |
# File 'lib/abanalyzer/matrix.rb', line 4 def initialize(values) @values = values @columns = values.keys @rows = values[@columns.first].keys validate end |
Instance Attribute Details
#columns ⇒ Object (readonly)
Returns the value of attribute columns.
3 4 5 |
# File 'lib/abanalyzer/matrix.rb', line 3 def columns @columns end |
#rows ⇒ Object (readonly)
Returns the value of attribute rows.
3 4 5 |
# File 'lib/abanalyzer/matrix.rb', line 3 def rows @rows end |
Instance Method Details
#column_sum(name) ⇒ Object
44 45 46 |
# File 'lib/abanalyzer/matrix.rb', line 44 def column_sum(name) get_column(name).inject { |a, b| a + b } end |
#each_cell ⇒ Object
32 33 34 35 36 37 38 |
# 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) ⇒ Object
40 41 42 |
# File 'lib/abanalyzer/matrix.rb', line 40 def get(colname, rowname) @values[colname][rowname] end |
#get_column(name) ⇒ Object
22 23 24 |
# File 'lib/abanalyzer/matrix.rb', line 22 def get_column(name) @values[name].values end |
#get_row(name) ⇒ Object
26 27 28 29 30 |
# File 'lib/abanalyzer/matrix.rb', line 26 def get_row(name) @values.map do |_colname, rows| rows[name] end end |
#row_sum(name) ⇒ Object
48 49 50 |
# File 'lib/abanalyzer/matrix.rb', line 48 def row_sum(name) get_row(name).inject { |a, b| a + b } end |
#total_sum ⇒ Object
52 53 54 |
# File 'lib/abanalyzer/matrix.rb', line 52 def total_sum @columns.map { |col| column_sum(col) }.inject { |a, b| a + b } end |
#validate ⇒ Object
11 12 13 14 15 16 17 18 19 20 |
# 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 |