Julia中含NaN的向量如何计算卷积?conv函数异常问题咨询
Julia中含NaN向量的conv函数行为分析与解决方案
首先明确:你遇到的这个情况是Julia 0.6.x版本的已知问题,不是FFT算法本身的锅,而是当时conv函数的实现逻辑导致的。
为什么会出现全NaN的结果?
在Julia 0.6里,conv默认使用基于FFT的算法来加速卷积计算。但FFT对NaN的处理是"一nan全nan"——只要输入数组里存在一个NaN,整个FFT变换的结果都会变成NaN,逆变换后自然输出全NaN的数组。但从卷积的数学定义来说,[1,2,NaN]和[1]的卷积应该完全等于原数组,你的预期结果是完全正确的。
高效解决方法(不用手动实现)
1. 优先升级Julia版本
Julia 1.0及以后的稳定版本已经修复了这个问题:新版本的conv会根据输入情况自动选择合适的实现,当输入包含NaN时,会切换到不会被NaN污染的直接卷积逻辑,或者对输入做兼容处理。升级后直接调用就能得到正确结果:
julia> conv([1,2,NaN],[1]) 3-element Vector{Float64}: 1.0 2.0 NaN
2. 无法升级时的替代方案
如果暂时不能升级,有两个高效的办法:
- 使用DSP包的conv函数:
DSP包的卷积实现对NaN的兼容性更好,安装后直接调用即可:using DSP conv([1,2,NaN],[1]) - 利用线性性质手动修正:先把NaN替换为0计算卷积,再把原数组中的NaN位置映射到结果中(这个方法性能和原生conv几乎一致):
function conv_with_nan(a::AbstractArray, b::AbstractArray) # 先计算替换NaN为0后的卷积 temp_conv = conv(ifelse.(isnan.(a), 0.0, a), b) # 找到原数组中的NaN位置,对应到卷积结果的位置 # 若b长度大于1,需调整偏移量:nan_indices .+ (length(b)-1) nan_indices = findall(isnan.(a)) temp_conv[nan_indices] .= NaN return temp_conv end # 测试调用 conv_with_nan([1,2,NaN],[1])
内容的提问来源于stack exchange,提问作者phinz
相关产品推荐
相关产品推荐

