Nic*_*ler 4 arrays sub-array julia
在julia中,我们可以检查数组是否包含值,如下所示:
> 6 in [4,6,5]
true
Run Code Online (Sandbox Code Playgroud)
但是,当尝试按特定顺序检查子数组时,这将返回false:
> [4,6] in [4,6,5]
false
Run Code Online (Sandbox Code Playgroud)
验证数组中是否存在特定子数组的正确语法是什么?
我认为值得一提的是,在 Julia 1.0 中你有这个功能 issubset
> issubset([4,6], [4,6,5])
true
Run Code Online (Sandbox Code Playgroud)
你也可以很方便地使用\subseteq乳胶符号来称呼它
> [4,6] ? [4,6,5]
true
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来非常优化:
> using Random
> x, y = randperm(10^3)[1:10^2], randperm(10^3);
> @btime issubset(x, y);
16.153 ?s (12 allocations: 45.96 KiB)
Run Code Online (Sandbox Code Playgroud)
创建一个性能良好的函数需要一些代码,但这比issubvec上面的版本要快得多:
function subset2(x,y)
lenx = length(x)
first = x[1]
if lenx == 1
return findnext(y, first, 1) != 0
end
leny = length(y)
lim = length(y) - length(x) + 1
cur = 1
while (cur = findnext(y, first, cur)) != 0
cur > lim && break
beg = cur
@inbounds for i = 2:lenx
y[beg += 1] != x[i] && (beg = 0 ; break)
end
beg != 0 && return true
cur += 1
end
false
end
Run Code Online (Sandbox Code Playgroud)
注意:如果函数实际返回子数组的开头位置(如果找到),则更有用,如果不是,则返回0,类似于findfirst/findnext函数.
时间信息(第二个是使用我的subset2函数):
0.005273 seconds (65.70 k allocations: 4.073 MB)
0.000086 seconds (4 allocations: 160 bytes)
Run Code Online (Sandbox Code Playgroud)
对于第三个条件,即向量[4,6]出现为4,6,5以下函数的子向量:
issubvec(v,big) =
any([v == slice(big,i:(i+length(v)-1)) for i=1:(length(big)-length(v)+1)])
Run Code Online (Sandbox Code Playgroud)
对于第二个条件,即为elsvector 中出现的每个元素提供一个布尔值,set建议如下:
function vecin(els,set)
res = zeros(Bool,size(els))
res[findin(els,set)]=true
res
end
Run Code Online (Sandbox Code Playgroud)
使用 OP 中的向量,结果如下:
julia> vecin([4,6],[4,6,5])
2-element Array{Bool,1}:
true
true
julia> issubvec([4,6],[4,6,5])
true
Run Code Online (Sandbox Code Playgroud)