N-dimensional slices is ready for comments!

Vlad Levenfeld via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Fri Jun 19 14:43:57 PDT 2015


On Friday, 19 June 2015 at 10:13:42 UTC, Ilya Yaroshenko wrote:
> On Friday, 19 June 2015 at 01:46:05 UTC, jmh530 wrote:
>> On Monday, 15 June 2015 at 08:40:31 UTC, Ilya Yaroshenko wrote:
>>> Hi All,
>>>
>>> PR and Examples: 
>>> https://github.com/D-Programming-Language/phobos/pull/3397
>>> DUB http://code.dlang.org/packages/dip80-ndslice
>>>
>>> N-dimensional slices is real world example where `static 
>>> foreach` would be useful.
>>> Corresponding lines was marked with //TODO: static foreach
>>>
>>> Best regards,
>>> Ilya
>>
>> The operator overloading and slicing mechanics look great, but 
>> I'm probably more excited about the future work you have 
>> listed.
>>
>> Some thoughts:
>> The top line of ndslice.d says it is for "creating 
>> n-dimensional random access ranges". I was able to get the 
>> example for operator overloading working for dynamic arrays, 
>> but it doesn't seem to work for static. Hopefully this work 
>> can be extended. In addition, hopefully the future work on 
>> foreach byElement will be able to work on static arrays in 
>> addition to dynamic.
>>
>
> You can slice fixed size arrays:
>
>
> auto myFun()
> {
>      float[4096] data;
>      auto tensor = data[].sliced(256, 16);
>      ///use tensor
> }
>
>> My second point seems to be related to a discussion on the 
>> github page about accessing N-dimensional arrays by index. 
>> Basically there are some circumstances where it is convenient 
>> to loop by index on an N-dimensional array.
>>
>
> Denis had the same concept already implemented in his `unstd` 
> library.
> So, ndslice is going to have it too.
>
>> Finally, I have been trying to do something like
>> auto A = 4.iota.sliced(2, 2).array;
>> auto B = to!(float[][])(A);
>> without any luck. Seems to work though for one-dimensional 
>> arraays. I think instead you have to do something like
>> auto A = iota(0.0f, 4.0f, 1).sliced(2, 2).array;
>
> Thanks!
> I will add this kind of functionality:
>
> auto A = 4.iota.sliced(2, 2);
> auto B = cast(float[][]) A;
>
> import std.conv;
> auto C = A.to!(float[][]); //calls opCast

https://github.com/evenex/autodata

N-dimensional slicing, range ops (map, zip, repeat, cycle, etc) 
lifted to n-dimensions, n-dim specific ops like extrusion, n-dim 
to d-dim of n-1-dim, flattening for lexicographic traversal, 
support for non-integer indices. I posted this awhile ago but no 
one took notice. But if this is happening here now, feel free to 
crib anything that you think might look useful, as I'd hate to 
think all of this prior work went to waste.


More information about the Digitalmars-d-announce mailing list