Working with arrays (flatten, transpose, verfify rectangular)

anonymouse anony at mouse.com
Fri Jul 22 05:17:49 UTC 2022


On Wednesday, 20 July 2022 at 09:18:29 UTC, anonymouse wrote:
>
> As for task 3, while I understand the concept of transposing a 
> matrix, I'm not sure how to even begin.
>

By not knowing how to begin, I mean that I don't know how to 
generalize the algorithm so that it applies to an array of 
arbitrary dimension/shape. If I already know the dimensions, I 
can hardcode that information and get it to work just fine. In 
the example below, since I know that ```a``` has a shape of [3, 
5, 7], I use that information to transpose the array:

```d
import std.traits;
auto transpose(A)(A a) if (isArray!A)
{
     auto tmp = new FlatElementType!A[3][5][7];  // [1]

     foreach(n0, i; a)
         foreach(n1, j; i)
             foreach(n2, k; j)
                 tmp[n2][n1][n0] = k;

     return tmp;
}

void main()
{
     auto a = [
         [
             [111,112,113,114,115,116,117],
             [121,122,123,124,125,126,127],
             [131,132,133,134,135,136,137],
             [141,142,143,144,145,136,147],
             [151,152,153,154,155,156,137]
         ],
         [
             [211,212,213,214,215,216,217],
             [221,222,223,224,225,226,227],
             [231,232,233,234,235,236,237],
             [241,242,243,244,245,236,247],
             [251,252,253,254,255,256,237]
         ],
         [
             [311,312,313,314,315,316,317],
             [321,322,323,324,325,326,327],
             [331,332,333,334,335,336,337],
             [341,342,343,344,345,336,347],
             [351,352,353,354,355,356,337]
         ]
     ];

     a.transpose.writeln;
}
```

Output reformatted for visual presentation:
```
[
     [
         [111, 211, 311],
         [121, 221, 321],
         [131, 231, 331],
         [141, 241, 341],
         [151, 251, 351]
     ],
     [
         [112, 212, 312],
         [122, 222, 322],
         [132, 232, 332],
         [142, 242, 342],
         [152, 252, 352]
     ],
     [
         [113, 213, 313],
         [123, 223, 323],
         [133, 233, 333],
         [143, 243, 343],
         [153, 253, 353]
     ],
     [
         [114, 214, 314],
         [124, 224, 324],
         [134, 234, 334],
         [144, 244, 344],
         [154, 254, 354]
     ],
     [
         [115, 215, 315],
         [125, 225, 325],
         [135, 235, 335],
         [145, 245, 345],
         [155, 255, 355]
     ],
     [
         [116, 216, 316],
         [126, 226, 326],
         [136, 236, 336],
         [136, 236, 336],
         [156, 256, 356]
     ],
     [
         [117, 217, 317],
         [127, 227, 327],
         [137, 237, 337],
         [147, 247, 347],
         [137, 237, 337]
     ]
]
```

As the example demonstrates, by knowing beforehand that it is a 
3D array of shape [3, 5, 7] , I can hardcode that information 
into the temp array and use the correct amount of nested loops to 
unwind and reassigned the values. I would like to accomplish this 
without knowing the shape before hand.

Any pointers would be appreciated.

Thanks,
--anonymouse

[1] Contributed by 
[ag0aep6g](https://forum.dlang.org/post/tb9pl1$gc1$1@digitalmars.com)


More information about the Digitalmars-d-learn mailing list