flatten
语法
flatten(X, [depthFirst=true])
参数
X 可以是向量、元组或矩阵。
depthFirst 可选参数,布尔值,默认值为 true,表示采用深度优先的算法。若设置为 false,则采用宽度算法。该参数仅在 X 是元组时生效。
详情
将矩阵、元组或一系列向量转换成一维向量。对于嵌套元组,flatten
使用不同的展开算法,具体取决于
depthFirst参数:
-
当depthFirst=true 时,
flatten
优先展开内层嵌套的元素。-
如果嵌套元素存在元组,则对这些元组的最内层元素进行展开,其他元素保持不变,返回结果仍为元组。
-
如果嵌套元素不是元组,则直接返回一个一维向量。
-
-
当depthFirst=false 时,
flatten
对最外层的元素进行展开,内层嵌套的元素保持不变。
可通过 reduce
递归调用 flatten
函数,将嵌套的元组展开为一维向量。
例子
将一个矩阵转换成向量。
m=1..10$5:2;
flatten(m);
// output
[1,2,3,4,5,6,7,8,9,10]
将一系列向量转换成一个向量。
a=1..10;
b = a cut 2;
b;
// output
([1,2],[3,4],[5,6],[7,8],[9,10])
flatten(b);
// output
[1,2,3,4,5,6,7,8,9,10]
x=flatten([1, [2,3]]);
x;
// output
[1,2,3]
关于将一个向量分成多个小的向量,参见 cut 函数。
将一个嵌套元组转换成一个向量。
- 采用深度优先算法
list = (1, (2, (3, 4, 5)), (6, 7), 8, [9])
x1 = flatten(list)
x1
//此时先将元组元素(3, 4, 5)、(6, 7)转换为一维向量[3,4,5]、[6,7],返回结果仍然为元组
// output:(1,(2,[3,4,5]),[6,7],8,[9])
x2= flatten(x1)
x2
//再次执行,将元组元素(2,[3,4,5])转换为一维向量[2,3,4,5],返回结果仍然为元组
// output:(1,[2,3,4,5],[6,7],8,[9])
x3= flatten(x2)
x3
//最后,将元组转换为一维向量
// output:[1,2,3,4,5,6,7,8,9]
-
设置 depthFirst=false,采用宽度优先算法
list = (1, (2, (3, 4, 5)), (6, 7), 8, [9])
y1 = flatten(list, false)
y1
// 对外层的每个元素进行展开,结果仍然是元组
// output: (1,2,(3,4,5),6,7,8,9)
y2 = flatten(y1, false)
y2
// output: (1,2,3,4,5,6,7,8,9)
y3 = flatten(y2, false)
// output: [1,2,3,4,5,6,7,8,9]
也可使用 reduce
函数循环执行转换,返回最终结果。reduce(flatten, init=list)
// output:[1,2,3,4,5,6,7,8,9]
若想观察逐步转换的结果,可使用 accumulate
。
accumulate(flatten, init=list)
// output:[(1,(2,(3,4,5)),(6,7),8,[9]),(1,(2,[3,4,5]),[6,7],8,[9]),(1,[2,3,4,5],[6,7],8,[9]),[1,2,3,4,5,6,7,8,9]]
将一个包含矩阵的元组转换成一个向量。
m = 1..10$5:2;
n = ( m ,11, (12, 13), [14])
reduce(flatten, init=n)
// output:[1,2,3,4,5,6,7,8,9,11,12,13,14]