class CAHistogram

Attributes

include_lowest[R]
include_upper[R]
inner[R]
mid_points[R]
midpoints[R]
offsets[R]
scales[R]

Public Class Methods

new(*argv, &block) click to toggle source
Calls superclass method
# File lib/carray/math/histogram.rb, line 25
def initialize (*argv, &block)

  case argv.first
  when Integer, String, Symbol
    data_type = argv.shift
  else
    data_type = CA_INT32
  end

  scales = argv.shift
  opt    = argv.shift || {}

  option = {
    :include_upper  => false,
    :include_lowest => true,
    :offsets        => nil,
  }.update( opt )

  @include_upper  = option[:include_upper]
  @include_lowest = option[:include_lowest]    

  unless scales.kind_of?(Array)
    raise "scales should be an array of scales"
  end

  ndim = scales.size
  @scales = scales.clone
  @scales.map! { |s| CArray.wrap_readonly(s, CA_DOUBLE) }
  
  if option[:offsets]
    if option[:offsets].size == scales.size
      @offsets = option[:offsets]
    else
      raise "invalid length of offset in option"
    end
  else
    @offsets = Array.new(ndim) { 0 }
  end

  dim = Array.new(ndim) { |i| 
    case @offsets[i]
    when 0
      @scales[i].size
    when 1
      @scales[i].size + 1
    else
      raise "invalid offset value"
    end
  }
  
  super(data_type, dim, &block)

  @mid_points = Array.new(ndim) { |i|
    x = (@scales[i] + @scales[i].shifted(-1))/2
    x[0..-2].to_ca
  }

  @inner = self[*Array.new(ndim) { |i| @offsets[i]..-2 }]

end

Public Instance Methods

add(*values) click to toggle source
# File lib/carray/math/histogram.rb, line 100
def add (*values)
  val = CArray.wrap_readonly(values.pop, self.data_type)
  sel = val.ne(0)
  val = val[sel].to_ca
  idx = Array.new(ndim) {|i|
    vi = CArray.wrap_readonly(values[i], CA_DOUBLE)[sel]
    @scales[i].bin(vi, @include_upper, @include_lowest, @offsets[i]).to_ca
  }
  index2addr(*idx).each_with_addr do |addr, i|
    self[addr] += val[i]
  end
  self
end
increment(*values) click to toggle source
# File lib/carray/math/histogram.rb, line 91
def increment (*values)
  idx = Array.new(ndim) {|i|
    vi = CArray.wrap_readonly(values[i], CA_DOUBLE)
    @scales[i].bin(vi, @include_upper, @include_lowest, @offsets[i]).to_ca
  }
  incr_addr(index2addr(*idx))
  self
end