Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
February 20, 2016 Transposing a static array | ||||
---|---|---|---|---|
| ||||
How would I transpose float[3][2] to float[2][3] with http://dlang.org/phobos/std_range.html#.transposed |
February 19, 2016 Re: Transposing a static array | ||||
---|---|---|---|---|
| ||||
Posted in reply to maik klein | 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 Re: Transposing a static array | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | 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 Re: Transposing a static array | ||||
---|---|---|---|---|
| ||||
Posted in reply to maik klein | 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 Re: Transposing a static array | ||||
---|---|---|---|---|
| ||||
Posted in reply to maik klein | 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 Re: Transposing a static array | ||||
---|---|---|---|---|
| ||||
Posted in reply to cym13 | 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.
|
Copyright © 1999-2021 by the D Language Foundation