Extend the scope of transpose

It allows a transposition in respect to the secondary "diagonal"
This commit is contained in:
RonaldoCMP 2020-08-11 14:55:25 +01:00
parent 1df84f3552
commit 50b0f170e7
2 changed files with 25 additions and 3 deletions

View file

@ -1287,6 +1287,10 @@ function array_dim(v, depth=undef) =
// Function: transpose()
// Description: Returns the transposition of the given array.
// When reverse=true, the transposition is done in respect to the secondary diagonal, that is:
// .
// reverse(transpose(reverse(arr))) == transpose(arr, reverse=true)
// By default, reverse=false.
// Example:
// arr = [
// ["a", "b", "c"],
@ -1313,14 +1317,30 @@ function array_dim(v, depth=undef) =
// // ["c", "f"],
// // ]
// Example:
// arr = [
// ["a", "b", "c"],
// ["d", "e", "f"],
// ["g", "h", "i"]
// ];
// t = transpose(arr, reverse=true);
// // Returns:
// // [
// // ["i", "f", "c"],
// // ["h", "e", "b"],
// // ["g", "d", "a"]
// // ]
// Example:
// transpose([3,4,5]); // Returns: [3,4,5]
function transpose(arr) =
function transpose(arr, reverse=false) =
assert( is_list(arr) && len(arr)>0, "The array is not a vector neither a matrix." )
is_list(arr[0])
? let( l0 = len(arr[0]) )
assert([for(a=arr) if(!is_list(a) || len(a)!=l0) 1 ]==[], "The array is not a vector neither a matrix." )
[for (i=[0:1:l0-1])
[ for (j=[0:1:len(arr)-1]) arr[j][i] ] ]
reverse
? [for (i=[0:1:l0-1])
[ for (j=[0:1:len(arr)-1]) arr[len(arr)-1-j][l0-1-i] ] ]
: [for (i=[0:1:l0-1])
[ for (j=[0:1:len(arr)-1]) arr[j][i] ] ]
: assert( is_vector(arr), "The array is not a vector neither a matrix." )
arr;

View file

@ -476,10 +476,12 @@ module test_array_dim() {
}
test_array_dim();
echo(transpose([[1,2,3],[4,5,6]],reverse=true));
module test_transpose() {
assert(transpose([[1,2,3],[4,5,6],[7,8,9]]) == [[1,4,7],[2,5,8],[3,6,9]]);
assert(transpose([[1,2,3],[4,5,6]]) == [[1,4],[2,5],[3,6]]);
assert(transpose([[1,2,3],[4,5,6]],reverse=true) == [[6,3], [5,2], [4,1]]);
assert(transpose([3,4,5]) == [3,4,5]);
}
test_transpose();