accumulate (:A)
语法
accumulate(func, X, [init]])
或
[init] <operator>:A X
参数
func 二元函数。
X 向量、矩阵或表。
当 X 是向量时,init 必须是标量;
当 X 是矩阵时,init 必须是向量;
当 X 是表时,init 必须是字典;
当 init 未指定时,
accumulate
返回值中的第一个元素是 X 的第一个元素,并且 X 的第一个元素的数据类型决定了结果的数据类型。
其他相关的 cum 系列函数的参数说明和窗口计算规则请参考: 累计窗口系列(cum 系列)
详情
accumulate 高阶函数先应用函数 / 运算符在 init 和 X[0] 上,再迭代地应用到前一个结果和 X 中的下一个元素上。对于 accumulate,当 init 缺失时,返回值的第一个元素是 X[0]。与 reduce 返回最后一个结果不同,accumulate 输出所有中间结果。accumulate 等同于下面伪代码的执行过程:
ret[0]=<function>(init,X[0]);
for(i:1~size(X)){
result[i]=<function>(result[i-1], X[i]);
}
return result;
例子
在一个向量上执行 accumulate:
$ x = 1 2 3;
$ accumulate(add, 1 2 3);
[1,3,6]
// 等同于 [1, 1+2, 3+3]
$ 1 +:A x;
[2,4,7]
// 等同于 [1+1, 2+2, 4+3]
$ accumulate(-, x, 2);
[1,-1,-4]
// 等同于 [2-1, 1-2, -1-3]
$ accumulate(mul, x);
[1,2,6]
// 等同于 [1, 1*2, 2*3]
$ def facts(a) {return 1*:A 1..a;};
$ facts 5;
[1,2,6,24,120]
// 计算累积因式分解。
$ def f1(a,b): a+log(b);
$ accumulate(f1, 1..5, 0);
[0,0.693147,1.791759,3.178054,4.787492]
// 上述例子计算了 log(1) 到 log(i) 之间的累加和,
// 注意到前一步的结果被当作函数的第一个参数。
// 0+log(1)=0, 0+log(2)=0.693147, 0.693147+log(3)=1.791759, ......
$ accumulate(f1, 1..5);
[1,2,3,4,6]
// 因为这里忽略了初始条件,输入向量的第一个元素的数据类型决定了返回值的数据类型
对一个矩阵执行 accumulate:
$ x=1..12$3:4;
$ x;
col1 |
col2 |
col3 |
col4 |
---|---|---|---|
1 |
4 |
7 |
10 |
2 |
5 |
8 |
11 |
3 |
6 |
9 |
12 |
$ + :A x;
col1 |
col2 |
col3 |
col4 |
---|---|---|---|
1 |
5 |
12 |
22 |
2 |
7 |
15 |
26 |
3 |
9 |
18 |
30 |