Julia中Fortran的eoshift非循环移位等效内置方法问询
Julia中对应Fortran
eoshift 的原生实现方法 Fortran中的循环移位函数cshift在Julia里有直接对应的circshift,但非循环移位函数eoshift(移位后用指定值填充新空位)没有内置同名函数,你可以用数组切片的方式实现原生高效的版本,替代原有的对角矩阵模拟方法。
原生实现代码
function eoshift(x::AbstractArray, k::Integer, fillval=0) n = length(x) k == 0 && return copy(x) k > 0 ? vcat(x[k+1:end], fill(fillval, k)) : vcat(fill(fillval, -k), x[1:n+k]) end
示例验证
- 向右移位2位(正k值,原数组起始部分被截断,末尾补0):
eoshift([1:9;], 2) # 输出:[3, 4, 5, 6, 7, 8, 9, 0, 0] - 向左移位2位(负k值,原数组末尾部分被截断,开头补0):
eoshift([1:9;], -2) # 输出:[0, 0, 1, 2, 3, 4, 5, 6, 7] - 自定义填充值(比如用-1填充空位):
eoshift([1:9;], 3, -1) # 输出:[4, 5, 6, 7, 8, 9, -1, -1, -1]
优势说明
相比原有的diagm(k=> ones(length(x)-abs(k)))*x矩阵乘法实现,切片方式直接操作数组元素,避免了不必要的矩阵构造和乘法运算,性能更优,逻辑也更直观。
内容的提问来源于stack exchange,提问作者aitzkora
相关产品推荐
相关产品推荐

