[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

sparse multi-dimensional arrays

Bill Birkett

10/3/2006 1:58:00 PM

I did like to convert some programs I wrote in Perl to Ruby. I'm
working with sparse three dimensional data. Here's an example in
Perl. The array @a has just two elements. The rest are undefined.

#!/usr/bin/perl -w

$a[0][0][0] = 0;
$a[100][100][100] = 100;

print "$a[0][0][0]\n";
print "$a[100][100][100]\n";

The output:

0
100

Is there an easy way to implement this sort of data structure in
Ruby? The Array class seems limited to one dimension. I looked at the
Matrix class, but there doesn't appear to be any way of assigning
values to the individual matrix elements (which seems pretty strange,
so maybe I'm overlooking the obvious).

-Bill
--

William B. Birkett - <wbirkett@doplganger.com>
Print Quality Consultant
Doppelganger, LLC - http://www.doplg...

48799 Meadow Drive, Plymouth, MI 48170 (USA)
Office: (734) 927-4232 FAX: (734) 468-0580
Cell: (734) 516-4790

5 Answers

Logan Capaldo

10/3/2006 2:12:00 PM

0

On Tue, Oct 03, 2006 at 10:58:22PM +0900, Bill Birkett wrote:
> I did like to convert some programs I wrote in Perl to Ruby. I'm
> working with sparse three dimensional data. Here's an example in
> Perl. The array @a has just two elements. The rest are undefined.
>
> #!/usr/bin/perl -w
>
> $a[0][0][0] = 0;
> $a[100][100][100] = 100;
>
> print "$a[0][0][0]\n";
> print "$a[100][100][100]\n";
>
> The output:
>
> 0
> 100
>
> Is there an easy way to implement this sort of data structure in
> Ruby? The Array class seems limited to one dimension. I looked at the
> Matrix class, but there doesn't appear to be any way of assigning
> values to the individual matrix elements (which seems pretty strange,
> so maybe I'm overlooking the obvious).
>
It's pretty easy if you know the dimensions before hand, a bit more
hackery pokery if you don't.
a = Array.new(101) { Array.new(101) { Array.new(101) } }
a[0][0][0] = 0
a[100][100][100] = 100

puts a[0][0][0]
puts a[100][100][100]


Paul Lutus

10/3/2006 4:07:00 PM

0

Bill Birkett wrote:

> I did like to convert some programs I wrote in Perl to Ruby. I'm
> working with sparse three dimensional data. Here's an example in
> Perl. The array @a has just two elements. The rest are undefined.
>
> #!/usr/bin/perl -w
>
> $a[0][0][0] = 0;
> $a[100][100][100] = 100;
>
> print "$a[0][0][0]\n";
> print "$a[100][100][100]\n";
>
> The output:
>
> 0
> 100
>
> Is there an easy way to implement this sort of data structure in
> Ruby? The Array class seems limited to one dimension. I looked at the
> Matrix class, but there doesn't appear to be any way of assigning
> values to the individual matrix elements (which seems pretty strange,
> so maybe I'm overlooking the obvious).

The solution depends on what you are trying to accomplish. If your aim is to
minimize storage space, then use a nested hash, with numeric indices as
keys. If your aim is simply to create an n-dimensional array and you don't
care about storage size, then follow the advice of another poster:

#!/usr/bin/ruby -w

dim_size = 100

arr = Array.new(dim_size) { Array.new(dim_size) { Array.new(dim_size,42) } }

puts arr[39][56][24]

42

--
Paul Lutus
http://www.ara...

futago

10/3/2006 4:48:00 PM

0

> $a[0][0][0] = 0;
> $a[100][100][100] = 100;
>
> print "$a[0][0][0]\n";
> print "$a[100][100][100]\n";
>
> The output:
>
> 0
> 100

I saw this on inquirylabs.com recently [1]

hsh = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))

hsh[0][0][0] = 0 >> 0
hsh[100][100][100] = 100 >> 100

HTH

Nathan

[1]
http://blog.inquirylabs.com/2006/09/20/ruby-hashes-of-arbitr...

--
Posted via http://www.ruby-....

Jason Nordwick

10/3/2006 5:18:00 PM

0

Close:

a={}
a[[0,0,0]], a[[100,100,100]] = 0, 100
puts "#{a[[0,0,0]]}"
puts "#{a[[100,100,100]]}"

But you might like this better (my Ruby isn't very good, so please excuse me if I overcomplicate these definitions):

class SparseMatrix < Hash
alias :oldget :[]
alias :oldset :[]=
def[](*i); self.oldget(i); end
def[]=(*i); v=i.pop; self.oldset(i,v); end
end

a = SparseMatrix.new
a[0,0,0], a[100,100,100] = 0, 100


irb(main):017:0> a
=> {[0, 0, 0]=>0, [100, 100, 100]=>100}
irb(main):018:0> puts "#{a[0,0,0]}"
0
=> nil
irb(main):019:0> puts "#{a[100,100,100]}"
100
=> nil
irb(main):020:0> puts "#{a[2,2,2]}"

=> nil
irb(main):021:0>

-j


Bill Birkett wrote:
> I did like to convert some programs I wrote in Perl to Ruby. I'm working
> with sparse three dimensional data. Here's an example in Perl. The array
> @a has just two elements. The rest are undefined.
>
> #!/usr/bin/perl -w
>
> $a[0][0][0] = 0;
> $a[100][100][100] = 100;
>
> print "$a[0][0][0]\n";
> print "$a[100][100][100]\n";
>
> The output:
>
> 0
> 100
>
> Is there an easy way to implement this sort of data structure in Ruby?
> The Array class seems limited to one dimension. I looked at the Matrix
> class, but there doesn't appear to be any way of assigning values to the
> individual matrix elements (which seems pretty strange, so maybe I'm
> overlooking the obvious).
>
> -Bill


Jason Nordwick

10/3/2006 5:24:00 PM

0


irb(main):005:0> hsh[1]
=> {}
irb(main):006:0> hsh[2]
=> {}
irb(main):007:0> hsh[3]
=> {}
irb(main):008:0> hsh
=> {1=>{}, 2=>{}, 3=>{}}

ugh.

-j


Nathan Grant wrote:
>> $a[0][0][0] = 0;
>> $a[100][100][100] = 100;
>>
>> print "$a[0][0][0]\n";
>> print "$a[100][100][100]\n";
>>
>> The output:
>>
>> 0
>> 100
>
> I saw this on inquirylabs.com recently [1]
>
> hsh = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))
>
> hsh[0][0][0] = 0 >> 0
> hsh[100][100][100] = 100 >> 100
>
> HTH
>
> Nathan
>
> [1]
> http://blog.inquirylabs.com/2006/09/20/ruby-hashes-of-arbitr...
>