深度学习九 —— 手撕 一维离散序列 的线性卷积 和 互相关

手撕 一维离散序列 的线性卷积 和 互相关

线性卷积

公式

一维离散线性卷积的计算公式如下:

( a ∗ v ) [ n ] = ∑ m = − ∞ ∞ a [ m ] v [ n − m ] (a * v)[n] = \sum_{m=-\infty}^{\infty}a[m]v[n-m] (av)[n]=m=a[m]v[nm]

其中:

a , v a, v a,v——数字序列;

n n n——移位的位数。

numpy中的convolve函数

numpy.convolve(a, v, mode="full")

假定序列 a a a长度为 N N N,序列 v v v长度为 M M M,则有

  • m o d e = ′ f u l l ′ mode='full' mode=full,则结果序列长度 = N + M − 1 =N + M -1 =N+M1,包括重合的端点处的卷积结果,有边界效应
  • m o d e = ′ s a m e ′ mode = 'same' mode=same,则结果序列长度 = max ⁡ ( N , M ) = \max(N , M) =max(N,M),有边界效应
  • m o d e = ′ v a l i d ′ mode = 'valid' mode=valid,则结果序列长度 = max ⁡ ( N , M ) − min ⁡ ( N , M ) + 1 = \max(N, M) - \min(N, M) + 1 =max(N,M)min(N,M)+1,只返回卷积核和输入序列完全重合时的结果,没有边界效应

注意: 在实际计算时,需要序列 a a a大于 v v v,否则 n u m p y numpy numpy内部会自动交换顺序

手撕 convolve

def convolve(a, v):
    r = []
    a = dict(enumerate(a))
    v = dict(enumerate(v))
    for i in range(len(a) + len(v) - 1):
        s = 0
        for j in range(len(a)):
            s += a[j] * v.get(i - j, 0)
        r.append(s)
    return r
 
if __name__ == "__main__":
    nums1 = [10, 13, 16, 19, 22, 25, 28]
    nums2 = [20, 22, 24]
 
    print(np.convolve(nums1, nums2, mode="full").tolist())
    print(convolve(nums1, nums2))
 

最终得到结果为:

[200, 480, 846, 1044, 1242, 1440, 1638, 1216, 672]
[200, 480, 846, 1044, 1242, 1440, 1638, 1216, 672]

互相关

公式

( a ∗ v ) [ n ] = ∑ m = − ∞ ∞ a ∗ [ m ] v [ n + m ] (a * v)[n] = \sum_{m=-\infty}^{\infty}a^{*}[m]v[n+m] (av)[n]=m=a[m]v[n+m]

其中,

a , v a, v a,v——数字序列;

n n n——移位位数;

a ∗ a^{*} a—— a a a序列值的复数共轭,即实部不变,虚部取反。

根据互相关的公式,我们可以得到在实数范围内, a ∗ = a a^{*} = a a=a

此时,通过比较两个公式可以得到:序列 a a a与序列 v v v反转后的序列 的 卷积 == 序列 a a a 与 序列 v v v的互相关

numpy互相关计算

numpy.correlate(a, v, mode)
  • m o d e = ‘ v a l i d ’ mode = ‘valid’ mode=valid:只返回有效的那一部分相关数据,共 M − N + 1 M-N+1 MN+1个;

  • m o d e = ‘ s a m e ’ mode = ‘same’ mode=same:只返回与 等长的那一部分相关数据,共 N N N个;

  • m o d e = ‘ f u l l ’ mode = ‘full’ mode=full:返回全部相关数据,共 M + N − 1 M+N-1 M+N1个。

手撕 correlate

根据公式中的结论,在实数范围内,

序列 a a a与序列 v v v反转后的序列 的 卷积 == 序列 a a a 与 序列 v v v的互相关

import numpy as np
def convolve(a, v):
    r = []
    a = dict(enumerate(a))
    v = dict(enumerate(v))
    for i in range(len(a) + len(v) - 1):
        s = 0
        for j in range(len(a)):
            s += a[j] * v.get(i - j, 0)
        r.append(s)
    return r
 
if __name__ == "__main__":
    nums1 = [10, 13, 16, 19, 22, 25, 28]
    nums2 = [20, 22, 24]
    print(np.correlate(nums1, nums2, mode="full").tolist())
    print(convolve(nums1, nums2[::-1]))

得到结果为:

[240, 532, 870, 1068, 1266, 1464, 1662, 1116, 560]
[240, 532, 870, 1068, 1266, 1464, 1662, 1116, 560]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
离散卷积线性卷积是相关的概念,但在物理含义和计算过程上有所不同。 离散卷积是指在离散时间或离散空间上对两个序列进行卷积运算。离散卷积的计算过程是将两个序列的对应元素相乘,然后求和。离散卷积的结果长度与输入序列的长度有关。 线性卷积是在信号与线性系统的背景下出现的,它描述了输入信号经过线性系统后的输出信号与输入信号之间的数学关系。线性卷积的计算过程是将输入信号与系统的冲激响应进行卷积运算。线性卷积的结果长度与输入信号和系统的冲激响应的长度有关。 可以说,离散卷积线性卷积的一种特殊情况,当输入信号和系统的冲激响应都是离散序列时,离散卷积就等价于线性卷积。但需要注意的是,离散卷积线性卷积的物理含义和计算过程是不同的。 #### 引用[.reference_title] - *1* *3* [卷积与相关](https://blog.csdn.net/jin930404/article/details/109024092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [图像处理(卷积)](https://blog.csdn.net/xiaojiang0805/article/details/7605210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L☆★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值