跳到主要内容
CalcMax

卷积计算器

结果

4, 13, 28, 27, 18

卷积结果

总和
90.000000
结果项数
5

卷积计算器把两个序列合成第三个:也就是常说的错位相乘:凡是能对上的一对一对乘起来,再把每一组乘积相加。这是两个有限序列的离散卷积,而「滑动」在这里是字面意思——一个序列一位一位地从另一个上面滑过去,每滑到一个位置就产生结果里的一项。结果的第一项是一个序列的首项乘另一个序列的首项,第二项是那里重叠的两个乘积之和,一直这样算到另一端。两个三项序列卷出来是五项,因为全卷积的长度等于两个长度之和减一。结果按顺序印出,位置本身就是索引;旁边还给出所有项的总和,那是一个一眼就能验的量,它永远等于两个序列各自之和的乘积。小数与负数照收,只填一个数也允许——与它卷积就是把这个序列整体缩放。

默认那对序列,逐个索引算一遍

索引 k各项相乘数值
01 × 44
11 × 5 + 2 × 413
21 × 6 + 2 × 5 + 3 × 428
32 × 6 + 3 × 527
43 × 618

这是面板那个读数背后的推导,每一项的索引都写明了——面板上不标索引,因为逗号分隔的一行本身已有顺序,而「第几项对应哪个索引」正是这张表要说的事。沿着中间那一列往下读,滑动的过程就看得见:乘积的个数往中间越来越多、到另一端又变少,而每一行只用到在那里真正重叠的那些项。数值都是整数,因为默认的两个序列都是整数序列;小数项会让这一列出现小数,而这张表一律用普通句点,因为表格单元格不做本地化。

公式

(a * b)[k] = Σᵢ a[i] × b[k − i] length = m + n − 1

a、b
两个序列,按分号分隔输入。它们的先后无关紧要——卷积是可交换的,把两个框对调会得到完全相同的结果。两个序列的长度不必相同,也都可以带小数或负数。每个框最多收两百项。
k
正在产生的那一项的索引,从 0 一直取到结果长度减一。它不会印在每一项旁边,因为逗号分隔的一行本身就有顺序:第一个数是 k = 0,第二个是 k = 1。下面那张参考表把默认那对序列的索引逐行写了出来,要核对位置就去那里看。
a[i] × b[k − i]
求和式里的一项乘积。对每个 k,索引 i 取遍两个序列都有值的一切位置,所以相加的乘积个数从两端的一项升到中间的最短序列长度。重叠的图案就是整个思想的所在:一个序列从另一个上面滑过,乘积一列一列地被收集起来。
Σᵢ
这些乘积的和,也就是结果里的一项。每一项舍到六位小数,而旁边报出的总和是由舍入后的项相加得到的,不是由原始项——所以你把手印在面板上的数加起来,得到的就是印着的那一个总和。
m + n − 1
结果的长度,它自己也是一个读数。两个三项序列得到五项;一个单数序列与一个三项序列卷积得到三项。比两个序列中较长的那个多出来的那几项,正是它是全卷积、而不是只保留完全重叠那一段的卷积的原因。

要把两个序列合成一个分布时用这一页:两颗骰子的点数和各有几种组合、滑动平均窗口对一串数做了什么、两个多项式的乘积系数是什么。问的是单个序列本身——它的项、它的和、它的规律——用数列计算器;而关心的是滑动平均的窗口怎么取时,就是平均数计算器那一页的事。

算例

  1. 一二三 与 四五六

    1. k = 0:只有首项重叠,1 × 4 = 4
    2. k = 1:1 × 5 + 2 × 4 = 5 + 8 = 13
    3. k = 2:1 × 6 + 2 × 5 + 3 × 4 = 6 + 10 + 12 = 28
    4. k = 3:2 × 6 + 3 × 5 = 12 + 15 = 27
    5. k = 4:只有末项重叠,3 × 6 = 18
    6. 结果是 4, 13, 28, 27, 18,总和是 90,也就是 6 × 15

    最后一行是让这一页容易信任的那个检查:卷积的各项之和永远等于两个序列各自之和的乘积,这里是 1 + 2 + 3 = 6 与 4 + 5 + 6 = 15。它来自代数本身,因为结果里的每一项都是两个序列各取一个相乘,而每一对可能的组合都恰好出现一次。

  2. 两颗骰子,以及点数和的形状

    1. 一颗骰子出现每个面的方式都只有一种,所以两个序列都是六个一
    2. 把它们卷起来就是在数「和为某个数」的组合有多少对:k = 0 给出 1 × 1 = 1,也就是和为 2 的一种情况
    3. k = 1 给出 1 + 1 = 2 种和为 3 的情况,往后一路升高
    4. 峰值是 6,落在中间那一项,也就是和为 7
    5. 结果是 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1,总和是 36

    这是中心极限定理的一个微缩演示:两个平坦的分布卷在一起得到一个三角形,再卷进第三颗骰子就会进一步向钟形靠拢。总和 36 同时也是检查——两个序列之和的乘积是 6 × 6,也就是每一对有序的点数组合各算一种。

  3. 单个数把整个序列缩放

    1. 只有一项的序列没有可以重叠的对象,所以结果的每一项都是它乘以另一个序列的一项
    2. k = 0:2 × 1 = 2
    3. k = 1:2 × 2 = 4
    4. k = 2:2 × 3 = 6
    5. 结果是 2, 4, 6,总和是 12,也就是 2 × 6

    这个退化情形值得跑一次,因为它说明滑动的画面是有尽头的:当一个序列长度是 1 时,永远不会有超过一项的乘积需要相加,卷积退化成了乘法。长度公式 m + n − 1 给出 1 + 3 − 1 = 3 而不是更大的数,是同一件事的另一面。

局限

这一页只算全卷积,也只算全卷积。两种只保留部分结果的变体不提供:一种是返回与较长输入等长的序列,另一种是只返回两个序列完全重叠的那些位置。这两者对两个偶数长度的序列都没有良好定义,而全卷积是同时包含它们的结果——那两个短变体是它的切片,不是另外的计算。每个序列最多两百项,每个数的绝对值不超过 1000000,这是显示上的限制:卷积先乘后加,大数在溢出双精度之前早就溢出了可读的范围。结果的每一项舍到六位小数,报出的总和是舍入后的项相加得到的,所以手算加起来会重现印出来的那个总和而不是一个略微不同的数。结果是一行逗号分隔的数字,不做本地化,所以小数点在任何语言下都是句点。位置本身承载索引,不逐项标注;默认那对序列的索引在参考表里逐行写明。

常见问题

两个序列怎么手算卷积?
让一个序列从另一个上面滑过去,每到一个位置就把对上的乘积加起来。1、2、3 与 4、5、6 卷起来,第一项是 1 × 4 = 4,第二项是 1 × 5 + 2 × 4 = 13,一路到最后 3 × 6 = 18。结果一共五项,因为两个三项序列的全卷积长度是 3 + 3 − 1。
怎么验算卷积算得对不对?
把结果的各项加起来,与两个序列各自之和的乘积比一比。1、2、3 与 4、5、6 卷出来是 90,而 6 × 15 也是 90,两者必须一致。原因在于结果里的每一项都是成对乘积之和,而两个序列之间每一对可能的组合都恰好落在其中某一项里。
为什么结果的项数比两个序列都多?
因为全卷积保留了只有部分重叠的那些位置。1、2、3 与 4、5、6 一共有五个这样的位置:两端各有一个只有一对相遇的位置,中间三个有多对相遇。另外两种更短的变体——返回与较长输入等长的,与只保留完全重叠的——都是这个结果的两个切片。
两颗骰子与概率有什么关系?
卷积在数组合数。一颗骰子就是六个 1 组成的序列,每个面一种情况;把这个序列与它自己卷积,数出来的就是「和为某个数」的有序组合有多少对:和为 2 有一种,和为 3 有两种,一路升到和为 7 的六种,然后又落回去。结果的总和 36 就是有序点对的总数,所以每一项除以它就得到概率。
移动平均也是卷积吗?
是。移动平均取一段等权的窗口——比如最近五天的数据各占五分之一——然后把它沿着数列滑过去,这正好就是与那个窗口做卷积。这也是卷积会出现在平滑、滤波与图像处理里的原因:被滑动的那个东西是一组权重,被平滑的那个东西是序列。

参考资料

相关计算器