# Sparse matrix 2

Class SparseVector

``````def initialize(h = {})
@vector = Hash.new(0)
@vector = @vector.merge!(h)
end

def [](i)
@vector[i]
end

def to_s
@vector.to_s
end
``````

end

class SparseMatrix

``````attr_reader :matrix

def initialize(h = {})
@matrix = Hash.new({})
for k in h.keys do
@matrix[k] = if h[k].is_a? SparseVector
h[k]
else
@matrix[k] = SparseVector.new(h[k])
end
end
``````

end

``````def [](i)
@matrix[i]
end

def col(j)
c = {}
for r in @matrix.keys do
c[r] = @matrix[r].vector[j] if
``````

@matrix[r].vector.keys.include? j
end
SparseVector.new c
end
end

hsh = SparseMatrix.new 1 => {1 => 33, 2 => 44, 3 => 55}, 2 => {1 => 66,
3 => 77}
puts hsh[1][3]
puts hsh.col(2)

That’s the code I have, I need to know if I can if I can get the indexes
of the hash looping through the hash.
I’ve tried using each-do, but i couldn’t make it work.
I need to do this so that I can operate with Sparse Matrices and Dense
Matrices.

On Tue, Nov 19, 2013 at 10:59 PM, aaron v. [email protected] wrote:

``````end
def initialize(h = {})
def [](i)
end
``````

end

hsh = SparseMatrix.new 1 => {1 => 33, 2 => 44, 3 => 55}, 2 => {1 => 66,
3 => 77}
puts hsh[1][3]
puts hsh.col(2)

That’s the code I have, I need to know if I can if I can get the indexes
of the hash looping through the hash.
I’ve tried using each-do, but i couldn’t make it work.

Since you are nesting Hashes you need a recursive approach at finding
all indexes.

def each_index
return enum_for(each_index) unless block_given?

each_entry(@matrix, []) {|i,| yield i}
self
end

def each_entry(hash, index_prefix, &b)
hash.each do |key, value|
idx = index_prefix + [key]

``````if Hash === value
each_entry(value, idx, &b)
else
yield idx, value
fi
``````

end
end

Kind regards

robert

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.