Julia 中有一个函数insert!
,可以在向量的一个位置处插入一个元素. 我的问题是怎么在这个位置插入一个矢量.
例如,
a=[1,2,3]
insert!(a,3,2)
会得到
4-element Vector{Int64}:
1
2
2
3
我想要这样的效果,
a=[1,2,3]
insert!(a,3,[1,2])
得到
[1,2,1,2,3]
请问应该如何实现呢
Julia 中有一个函数insert!
,可以在向量的一个位置处插入一个元素. 我的问题是怎么在这个位置插入一个矢量.
例如,
a=[1,2,3]
insert!(a,3,2)
会得到
4-element Vector{Int64}:
1
2
2
3
我想要这样的效果,
a=[1,2,3]
insert!(a,3,[1,2])
得到
[1,2,1,2,3]
请问应该如何实现呢
谢谢。不过我没有在文档中找到相应的函数。
我仿照标准库中的函数insert!
的写法,写了一个函数myinsert!
来实现这个功能:
function myinsert!(a::Array{T,1}, i::Integer, b::Array{S,1}) where {T, S}
# Throw convert error before changing the shape of the array
_b = S == T ? b : convert(Array{T,1}, b)::Array{T,1}
n = length(b)
Base._growat!(a, i, n)
# _growat! already did bound check
@inbounds for j in 1:n
a[i+j-1] = _b[j]
end
return a
end
现在的话,
aa=[1.,2,3]
myinsert!(aa,3,[1,2])
会得到
5-element Vector{Float64}:
1.0
2.0
1.0
2.0
3.0
这个问题本质上是 flatten 的问题。
如果目标是没有副作用的话,vcat 函数可能更适合你的需求。
julia> vcat(a, 3,[1,2])
6-element Vector{Int64}:
1
2
3
3
1
2
谢谢你的建议. 不过我确实需要改变矢量 a
. 而且这个vcat
函数只能拼接不能插入. a=[1,2,3]
, 在第三个位置插入矢量[1,2]
, 我希望得到的是[1,2,1,2,3]
,而不是[1,2,3,1,2]
.当然可以写一个函数,先将a
拆分再在需要的位置拼接上插入的矢量, 虽然我没有做过测试,但我觉得这个函数的性能不如myinsert!
.
display(vcat(a[1:end-1],prepend!([a[end]],[1,2])))