Transposing a static array

cym13 via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Feb 19 19:02:11 PST 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]]);
     }



More information about the Digitalmars-d-learn mailing list