我知道有一个功能可以做到这一点,例如:
A = [1,2,0,0,4,0]
find(A)
3-element Array{Int64,1}:
1
2
5
我想按照自己的方式去做,但是,我被困在这里
for i=1:endof(A)
if A[i] != 0
[]
end
end
提前致谢。
答案 0 :(得分:5)
这是另一种选择:
function myfind(c)
a = similar(c, Int)
count = 1
@inbounds for i in eachindex(c)
a[count] = i
count += (c[i] != zero(eltype(c)))
end
return resize!(a, count-1)
end
对于我测试的所有案例,它实际上都超过find
,但是对于您发布的非常小的示例向量,差异可以忽略不计。避免分支和动态增长索引数组可能有一些性能优势。
答案 1 :(得分:2)
我注意到这个问题确实很混乱(因为制定不当,对此感到抱歉)。因此,有两种可能的答案:一种是[1,2,4]
,它是一个非零元素的数组;另一个是[1,2,5]
,它是非零元素索引的数组。
让我们从第一个选项
开始A = [1,2,0,0,4,0]
B = []
for i=1:endof(A)
if A[i] != 0
push!(B,i)
end
end
println(B)
输出为Any[1,2,5]
但是,这种类型不是我想要的那种。使用typeof(B)
它会显示Array{Any,1}
,因此我添加了以下代码:
B = Array{Int64}(B)
println(B)
typeof(B)
结果是理想的
[1,2,5]
Array{Int64,1}
为了提高效率,按照评论中的建议,我在循环之前使用eltype()
函数指定了B的类型,如下所示:
A1 = [1,2,0,0,4,0] #The default type is Array{Int64,1}
B1 = eltype(A1)[] #Define the type of the 0 element array B with the type of A
#B1 = eltype(typeof(A))[] this is also valid
for i=1:endof(A1)
if A1[i] != 0
push!(B1::Array{Int64,1},i::Int64)
end
end
println(B1)
typeof(B1)
然后,输出再次是所需的
[1,2,5]
Array{Int64,1}
最简单的方法是使用函数find()
。但是,由于我是初学者,我想以另一种方式做到这一点。但是,@ DNF提供的另一个替代方案在测试它的情况下表现优于find()
(见下面的答案)。
其他用户(@Harrison Grodin和@P i)在本次讨论中提供了第二个选项,它创建了一个非零元素的输出矩阵。
感谢各位的帮助!
答案 2 :(得分:2)
你有几个选择。
使用您开始使用的策略,您可以在push!
循环中使用for
。
julia> B = Int[]
0-element Array{Int64,1}
julia> for element = A
if element != 0
push!(B, element)
end
end
julia> B
3-element Array{Int64,1}:
1
2
4
您也可以选择使用短路评估。
julia> for element = A
element != 0 && push!(B, element)
end
julia> for element = A
element == 0 || push!(B, element)
end
filter
和列表推导都是有效的!
julia> B = [element for element = A if element != 0]
3-element Array{Int64,1}:
1
2
4
julia> filter(n -> n != 0, A)
3-element Array{Int64,1}:
1
2
4
编辑:感谢OP的评论,我意识到所需的结果是非零元素的 indices ,而不是元素本身。这可以通过以下方式简单地实现。 :)
julia> find(A)
3-element Array{Int64,1}:
1
2
5