From: Larry Evans Date: 2011-01-10T14:10:18+09:00 Subject: Re: Nooby question : multidimensional arrays. --------------070309010601080507010002 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 01/08/11 13:33, Larry Evans wrote: > On 01/07/11 21:57, Larry Evans wrote: >> On 01/07/11 17:56, Kedar Mhaswade wrote: >>> Is this an okay job of implementing a multidimensional array? >>> >>> https://github.com/kedarmhaswade/datacube/blob/master/data_cube.rb >>> >>> Thank you for any feedback. >>> >>> -Kedar >>> >> There's a book: >> >> http://web.engr.oregonstate.edu/~budd/Books/aplc/ >> >> which describes an expansion vector which is a scan of >> the array sizes. IOW, for: >> >> arr = Array.new(s0,s1,...sn) >> >> the expansion vector for this arr is: >> >> arr.ev = [1, s0, s0*s1, s0*s1*s3,..., s0*s1*...*sn] >> > The expansion vector for DataCube.new(n,m) would be: > > [m**0,m**1,m**2,...,m**n] > > IOW, the length of this expansion vector is n+1. > > [snip] >> >> arr[i0,i1,..., ij, ... in] >> >> is located: >> >> i0*arr.ev[0]+i1*arr.ev[1]+...+in*arr.ev[n] >> >> elements from the 1st element: >> >> arr[0,0,...,0] >> >> Thus, given the sizes, you can create a member variable >> which is the expansion vector, then use that to access the >> elements by calculating the offset from the initial element >> using the dot product: >> >> i0*arr.ev[0]+i1*arr.ev[1]+...+in*arr.ev[n] >> [snip] To illustrate, the attached produces output: 44 12 [0,0,0] 0 [1,0,0] 1 [0,1,0] 2 [1,1,0] 3 [1,1,2] 11 [ [ [0, 1] , [2, 3] ] , [ [4, 5] , [6, 7] ] , [ [8, 9] , [44, 11] ] ] The last several lines (starting with [ [ [) show the output to the to_s and were designed to show (hopefully) the nested subarray's. -regards, Larry --------------070309010601080507010002 Content-Type: application/x-ruby; name="ArrayEv.rb" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ArrayEv.rb" IyEvdXNyL2Jpbi9lbnYgcnVieQoKI2luIHBsYWNlIGVkaXRpbmcgYXQgZ2l0aHViIGlzICJq dXN0IGF3ZXNvbWUiCgpjbGFzcyBBcnJheUV2CiAgIyBpbXBsZW1lbnRzIGFuIG4tZGltZW5z aW9uYWwgZGF0YSBjdWJlIHdpdGggZWFjaCBkaW1lbnNpb24gaGF2aW5nIG0gZWxlbWVudHMK ICAjIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpcyBtKipuLCBhbGwgZWxlbWVudHMgYXJl IGluaXRpYWxpemVkIGluIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5CgogIGRlZiBpbml0aWFs aXplKHNpemVzKQogICMgUHVycG9zZToKICAjICAgY3JlYXRlcyBBcnJheUV2IHdpdGggc2l6 ZXMubGVuZ3RoIGRpbWVuc2lvbnMKICAjIFBhcmFtczoKICAjICAgc2l6ZXNbaV0gaXMgdGhl IHNpemUgb2YgaS10aCBkaW1lbnNpb24KICAgIEBldiA9IHNpemVzLmluamVjdChbMV0pe3x6 LHh8IHogPDwgei5sYXN0ICogeH0KICAgIEBhcnJheSA9IEFycmF5Lm5ldyhAZXYubGFzdCl7 fGluZGV4fCBpbmRleH0KICBlbmQKICAKICAjIGFjY2Vzc29yIC0tIHJldHVybnMgdGhlIGVs ZW1lbnQgYXQgW2ksIGosIC4uLiwgbl0gd2hlcmUgZWFjaCBvZiBpLCBqLCBrIGlzIGJldHdl ZW4gMCBhbmQgbSwgKG0gZXhjbHVzaXZlKQogICMgKFRoZSBwYXJhbWV0ZXIgaXMgYW4gYXJy YXkgb2YgbGVuZ3RoIG4uIEVhY2ggZWxlbWVudCBvZiB0aGlzIGFycmF5IG11c3QgYmUgYmV0 d2VlbiAwIGFuZCBtLCBleGNsdXNpdmUpCiAgZGVmIFtdKCppbmRpY2VzKQogICAgQGFycmF5 W3RvX2luZGV4KGluZGljZXMpXQogIGVuZAoKICBkZWYgW109KCppdikKICAgICMgbWFrZSBz dXJlIGl2IGlzIGFuIGFycmF5IHdpdGggbGVuZ3RoIG4rMQogICAgdmFsdWUgPSBpdi5wb3AK ICAgIEBhcnJheVt0b19pbmRleChpdildID0gdmFsdWUKICBlbmQKCiAgZGVmIHNpemUKICAg IEBhcnJheS5zaXplCiAgZW5kCiAgZGVmIHRvX3MKICAgIHRvX3NfaW5kZW50ZWQoMCxAZXYu bGVuZ3RoLTEpCiAgZW5kCiBwcml2YXRlCiAgZGVmIHRvX2luZGV4KGluZGljZXMpCiAgICAj IG9mZnNldCBpbiBAYXJyYXkgY29ycmVzcG9uZGluZyB0byBpbmRpY2VzLgogICAgb2Zmc2V0 ID0gMAogICAgaW5kaWNlcy5lYWNoX2luZGV4IHt8aXwgb2Zmc2V0ICs9IGluZGljZXNbaV0q QGV2W2ldIH0KICAgIG9mZnNldAogIGVuZAogIGRlZiB0b19zX2luZGVudGVkKG9mZl9iZWcs IG54dF9kaW0pCiAgICBub3dfZGltID0gbnh0X2RpbS0xCiAgICBzaXplID0gQGV2W254dF9k aW1dL0Bldltub3dfZGltXQogICAgd2lkdGg9MiAjd2lkdGggb2YgYWxsIG1hcmdpbnMKICAg IG1hcmcgPSAiIi5yanVzdCh3aWR0aCooQGV2Lmxlbmd0aC1ueHRfZGltLTEpKQogICAgaWYg bm93X2RpbSA+IDAgdGhlbgogICAgICBybmcgPSAwLi4uc2l6ZQogICAgICBybmcuZWFjaCBk byB8aXwgCiAgICAgICAgaWYgaSA9PSAwCiAgICAgICAgICBwcmludGYoIiVzIiwiWyIubGp1 c3Qod2lkdGgpKQogICAgICAgIGVsc2UKICAgICAgICAgIHByaW50ZigiJXMlcyIsbWFyZywi LCIubGp1c3Qod2lkdGgpKQogICAgICAgIGVuZAogICAgICAgIHRvX3NfaW5kZW50ZWQob2Zm X2JlZytpKkBldltub3dfZGltXSwgbm93X2RpbSkKICAgICAgZW5kCiAgICAgIHByaW50Zigi JXMlc1xuIixtYXJnLCJdIikKICAgIGVsc2UKICAgICAgb2ZmX2VuZCA9IG9mZl9iZWcrc2l6 ZS0xCiAgICAgIHZlYyA9IEBhcnJheVtvZmZfYmVnLi5vZmZfZW5kXQogICAgICBwcmludGYo IiVzXG4iLHZlYy5pbnNwZWN0KQogICAgZW5kCiAgZW5kCmVuZAoKZGMgPSBBcnJheUV2Lm5l dyhbMiwyLDNdKQpkY1swLDEsMl09NDQKcHV0cyBkY1swLCAxLCAyXQpwdXRzIGRjLnNpemUK cHV0cyAiWzAsMCwwXSIKcHV0cyBkY1swLDAsMF0KcHV0cyAiWzEsMCwwXSIKcHV0cyBkY1sx LDAsMF0KcHV0cyAiWzAsMSwwXSIKcHV0cyBkY1swLDEsMF0KcHV0cyAiWzEsMSwwXSIKcHV0 cyBkY1sxLDEsMF0KcHV0cyAiWzEsMSwyXSIKcHV0cyBkY1sxLDEsMl0KZGMudG9fcwoK --------------070309010601080507010002--