cumsum和cumprod分别用于累加或者累乘,其效果如下
x = ones(Int, 1,5) # 1 1 1 1 1
y = cumsum(x, dims=2) # 1 2 3 4 5
z = cumprod(y, dims=2) # 1 2 6 24 120
accumulate可基于任意运算符对数组进行计算,例如
accumulate(+, x) # 1 2 3 4 5
如果计算的是矩阵,那么在未声明轴的情况下,默认按列累积
x = ones(Int, 5, 5);
accumulate(+, x)
上述代码的计算结果如下
[
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
]
→
[
1
6
11
16
21
2
7
12
17
22
3
8
13
18
23
4
9
14
19
24
5
10
15
20
25
]
[1111111111111111111111111]
如果指定坐标轴,那么将沿着坐标轴进行计算,例如下面的代码
accumulate(+, x, dims=1)
计算结果如下
[
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3
4
4
4
4
4
5
5
5
5
5
]
[1111122222333334444455555]
accumulate还可以指定初始值,例如
accumulate(+, x, init=100)
计算结果为
[
101
106
111
116
121
102
107
112
117
122
103
108
113
118
123
104
109
114
119
124
105
110
115
120
125
]
[101106111116121102107112117122103108113118123104109114119124105110115120125]
cumsum, cumprod以及accumulate都有一个配套的!函数,可以直接更改输入变量的值,其参数列表如下,其中参数A是待处理数组,B则用于存放计算结果。
cumsum!(B, A; dims::Integer)
cumprod!(B, A; dims::Integer)
accumulate!(op, B, A; [dims], [init])