I didn't your last message when I answered. Let me have a look at your solution.
Thanks On Mon, Dec 4, 2017 at 9:19 AM Francisco Ramos <[email protected]> wrote: > I had similar idea, walking the entire buffer and somehow check boundaries > (dimension size) but I was wondering if there is a better way since we > could have a huge buffer (this might be shared across multiple ndarrays), > let's say a couple of hundred thousands items, but a ndarray with a small > view of this buffer, let's say a thousand items. I wouldn't want to go > through hundreds of thousands for just one thousand. That's why I'm trying > to come up with a function that have the behavior I described initially, > "nextlocation". Along with "index" function I can work out in O(1) the > index for the next one > > Thanks, > Fran > > On Mon, Dec 4, 2017, 08:53 Matthieu Pizenberg < > [email protected]> wrote: > >> Oops, not as trivial as I thought ahah. Forget previous answer. It may >> require just some little adjustment though, I will think about it. >> >> >> On Monday, December 4, 2017 at 3:49:23 PM UTC+8, Matthieu Pizenberg wrote: >>> >>> Regarding your question, walking the array is not complicated I think. >>> You can just walk the underlying buffer, and use a function like below if >>> I'm not mistaking. >>> >>> location : Int -> Int -> Strides -> Shape -> Maybe Location >>> location bufferIndex bufferOffset (stride1, stride2) (height, width) = >>> let >>> unOffset = >>> bufferIndex - bufferOffset >>> >>> line = >>> unOffset // stride1 >>> >>> column = >>> unOffset % stride1 >>> in >>> if line < height && column < width then >>> Just (line, column) >>> else >>> Nothing >>> >>> Generalization would proceed the same, using euclidean division and >>> modulo, dimension after dimension. >>> >>> On Friday, December 1, 2017 at 11:22:16 PM UTC+8, Francisco Ramos wrote: >>>> >>>> Hi guys, >>>> >>>> been trying to figure out for a while now how I can solve this problem. >>>> I've implemented my own type of array, it's called NdArray. The way it >>>> works is as follow: >>>> It has a buffer (an array of something), a shape (list of dimensions), >>>> strides (list of steps) and an offset. Imagine we have a NdArray with a >>>> buffer of 9 numbers [1, 2, 3, 4, 5, 6, 7, 8, 9], shape [3, 3] (square >>>> matrix) and this leads to a list of strides [3, 1]. This last one means, >>>> there is a jump of 3 numbers for each of the first dimension. Better >>>> visualised: >>>> >>>> buffer => [1, 2, 3, 4, 5, 6, 7, 8, 9] >>>> view of this buffer with shape [3, 3] => >>>> [ 1, 2, 3 >>>> , 4, 5, 6 >>>> , 7, 8, 9 >>>> ] >>>> >>>> Now, imagine I change the strides to be [2, 2], that means, I'm jumping >>>> one per dimension (in this square matrix I'm jumping one column and one >>>> row). The result is: >>>> [ 1, 3 >>>> , 7, 9 >>>> ] >>>> >>>> I'm jumping one number in the last dimension, and an entire row in the >>>> first dimension. Shape is now [2, 2]. >>>> >>>> So I have all this implemented already here >>>> https://github.com/jscriptcoder/elm-ndarray. This is port of ndarray >>>> by Mikola Lysenko, https://github.com/scijs/ndarray. But I got stuck >>>> how to walk this array. I'm trying to implement map, filter and fold >>>> (foldl), and to do so I must be able to walk this array, which is not that >>>> trivial (or at least not for me). I have implemented a function "index" >>>> which takes a location in the form of list of Int and calculates the index >>>> based on shape, strides and offset. So I'm trying to find a way to >>>> implement this functionality: >>>> For example, for a [3, 3] shape then >>>> nextLocation [0, 0] => Just [0, 1] >>>> nextLocation [0, 1] => Just [0, 2] >>>> nextLocation [0, 2] => Just [1, 0] >>>> nextLocation [1, 0] => Just [1, 1] >>>> nextLocation [1, 1] => Just [1, 2] >>>> ... >>>> nextLocation [2, 2] => Nothing >>>> >>>> By far not an expert in functional programming, maybe someone can help >>>> me to figur this one out? >>>> >>>> Thanks a lot. >>>> >>>> Fran >>>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "Elm Discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
