Thread overview
Transposing a static array
Feb 20, 2016
maik klein
Feb 20, 2016
Ali Çehreli
Feb 20, 2016
maik klein
Feb 20, 2016
cym13
Feb 20, 2016
maik klein
Feb 20, 2016
Ali Çehreli
February 20, 2016
How would I transpose

float[3][2]

to

float[2][3]

with http://dlang.org/phobos/std_range.html#.transposed


February 19, 2016
On 02/19/2016 06:00 PM, maik klein wrote:
> How would I transpose
>
> float[3][2]
>
> to
>
> float[2][3]
>
> with http://dlang.org/phobos/std_range.html#.transposed
>
>

Because static arrays are not ranges, they must be used as slices with the help of []. The following code does the same thing in two different ways:

import std.stdio;
import std.range;
import std.algorithm;

void main() {
    float[3][2] arr = [ [1, 2, 3],
                        [4, 5, 6] ];

    // Method A
    {
        float[][] arr2;

        foreach (ref a; arr) {
            arr2 ~= a[];
        }

        writeln(arr2.transposed);
    }

    // Method B
    {
        auto r = arr[].map!((ref a) => a[]).array.transposed;
        writeln(r);
    }
}

Ali

February 20, 2016
On Saturday, 20 February 2016 at 02:22:12 UTC, Ali Çehreli wrote:
> On 02/19/2016 06:00 PM, maik klein wrote:
>> How would I transpose
>>
>> float[3][2]
>>
>> to
>>
>> float[2][3]
>>
>> with http://dlang.org/phobos/std_range.html#.transposed
>>
>>
>
> Because static arrays are not ranges, they must be used as slices with the help of []. The following code does the same thing in two different ways:
>
> import std.stdio;
> import std.range;
> import std.algorithm;
>
> void main() {
>     float[3][2] arr = [ [1, 2, 3],
>                         [4, 5, 6] ];
>
>     // Method A
>     {
>         float[][] arr2;
>
>         foreach (ref a; arr) {
>             arr2 ~= a[];
>         }
>
>         writeln(arr2.transposed);
>     }
>
>     // Method B
>     {
>         auto r = arr[].map!((ref a) => a[]).array.transposed;
>         writeln(r);
>     }
> }
>
> Ali

Your "Method B" is how I did it too but how do I convert it back to a static array of float[2][3]?
February 20, 2016
On Saturday, 20 February 2016 at 02:26:56 UTC, maik klein wrote:
> On Saturday, 20 February 2016 at 02:22:12 UTC, Ali Çehreli wrote:
>> On 02/19/2016 06:00 PM, maik klein wrote:
>>> How would I transpose
>>>
>>> float[3][2]
>>>
>>> to
>>>
>>> float[2][3]
>>>
>>> with http://dlang.org/phobos/std_range.html#.transposed
>>>
>>>
>>
>> Because static arrays are not ranges, they must be used as slices with the help of []. The following code does the same thing in two different ways:
>>
>> import std.stdio;
>> import std.range;
>> import std.algorithm;
>>
>> void main() {
>>     float[3][2] arr = [ [1, 2, 3],
>>                         [4, 5, 6] ];
>>
>>     // Method A
>>     {
>>         float[][] arr2;
>>
>>         foreach (ref a; arr) {
>>             arr2 ~= a[];
>>         }
>>
>>         writeln(arr2.transposed);
>>     }
>>
>>     // Method B
>>     {
>>         auto r = arr[].map!((ref a) => a[]).array.transposed;
>>         writeln(r);
>>     }
>> }
>>
>> Ali
>
> Your "Method B" is how I did it too but how do I convert it back to a static array of float[2][3]?

I don't see the point of using transposed which gives a range out if you want to put it back into a float[2][3] right away, just do a double foreach:

    void main(string[] args) {
        float[3][2] src = [[1, 2, 3], [2, 3, 4]];

        float[2][3] dst;

        foreach (i ; 0..src.length)
            foreach (j ; 0..src[0].length)
                dst[j][i] = src[i][j];

        assert(dst == [[1, 2], [2, 3], [3, 4]]);
    }

February 19, 2016
On 02/19/2016 06:26 PM, maik klein wrote:
> On Saturday, 20 February 2016 at 02:22:12 UTC, Ali Çehreli wrote:
>> On 02/19/2016 06:00 PM, maik klein wrote:
>>> How would I transpose
>>>
>>> float[3][2]
>>>
>>> to
>>>
>>> float[2][3]
>>>
>>> with http://dlang.org/phobos/std_range.html#.transposed

>>         auto r = arr[].map!((ref a) => a[]).array.transposed;

There is a problem there. Adding the following line

    writeln(r.array);

causes an error:

core.exception.AssertError@/usr/include/dmd/phobos/std/range/primitives.d(2207): Attempting to fetch the front of an empty array of float

Adding the following two lines does *not* preserve the range (first one does):

    writeln(r.save);
    writeln(r.save);

Did I not need (ref a) up there? I thought it would be a reference to a float[3] element.

>>         writeln(r);
>>     }
>> }
>>
>> Ali
>
> Your "Method B" is how I did it too but how do I convert it back to a
> static array of float[2][3]?

I don't know. :D

Ali

February 20, 2016
On Saturday, 20 February 2016 at 03:02:11 UTC, cym13 wrote:
> On Saturday, 20 February 2016 at 02:26:56 UTC, maik klein wrote:
>> On Saturday, 20 February 2016 at 02:22:12 UTC, Ali Çehreli wrote:
>>> [...]
>>
>> Your "Method B" is how I did it too but how do I convert it back to a static array of float[2][3]?
>
> I don't see the point of using transposed which gives a range out if you want to put it back into a float[2][3] right away, just do a double foreach:
>
>     void main(string[] args) {
>         float[3][2] src = [[1, 2, 3], [2, 3, 4]];
>
>         float[2][3] dst;
>
>         foreach (i ; 0..src.length)
>             foreach (j ; 0..src[0].length)
>                 dst[j][i] = src[i][j];
>
>         assert(dst == [[1, 2], [2, 3], [3, 4]]);
>     }

You are right. I restricted myself from using indices because I wanted to learn ranges but I think that working with matrices is actually much simpler by just using good old for loops.