module NumRu::Misc::MD_Iterators

Public Instance Methods

each_subary_at_dims( *dims ) { |self| ... } click to toggle source
# File lib/numru/misc/md_iterators.rb, line 88
def each_subary_at_dims( *dims )
  if dims.min<0 || dims.max>=rank
    raise ArguemntError,"Invalid dims #{dims.inspect} for #{rank}D array"
  end

  loopdims = Array.new
  sh = Array.new
  len = 1
  (0...rank).each{|i| 
    if !dims.include?(i)
      loopdims.push(i) 
      sh.push(shape[i])
      len *= shape[i]
    end
  }
  if loopdims.length == 0
    yield(self)
    return self
  end
  cs = [1]
  (1...sh.length).each{|i| cs[i] = sh[i-1]*cs[i-1]}
  idx = Array.new
  all = 0..-1
  for i in 0...len do
    loopdims.each_with_index{|d,j| idx[d] = ( (i/cs[j])%sh[j] )}
    dims.each{|d| idx[d] = all}
    sub = self[ *idx ]
    yield(sub)
  end
  self
end
each_subary_at_dims_with_index( *dims ) { |self, false| ... } click to toggle source
# File lib/numru/misc/md_iterators.rb, line 120
def each_subary_at_dims_with_index( *dims )
  if dims.min<0 || dims.max>=rank
    raise ArguemntError,"Invalid dims #{dims.inspect} for #{rank}D array"
  end

  loopdims = Array.new
  sh = Array.new
  len = 1
  (0...rank).each{|i| 
    if !dims.include?(i)
      loopdims.push(i) 
      sh.push(shape[i])
      len *= shape[i]
    end
  }
  if loopdims.length == 0
    yield(self, false)
    return self
  end
  cs = [1]
  (1...sh.length).each{|i| cs[i] = sh[i-1]*cs[i-1]}
  idx = Array.new
  all = 0..-1
  for i in 0...len do
    loopdims.each_with_index{|d,j| idx[d] = ( (i/cs[j])%sh[j] )}
    dims.each{|d| idx[d] = all}
    sub = self[ *idx ]
    yield(sub, idx)
  end
  self
end