Có vẻ như bạn đang tìm kiếm indexin
(cũng giống như thức ăn gia súc tìm kiếm, điều này được gọi là cũng ismember
bởi Matlab). Nó hơi khác một chút: nó trả về một vectơ trong đó phần tử thứ i là chỉ số cuối cùng ở đó v1[i]
xuất hiện trong v2
.
julia> v1 = [8,6,7,11]; v2 = -10:10;
idxs = indexin(v1, v2)
4-element Array{Int64,1}:
19
17
18
0
Nó trả về zero cho chỉ số của một phần tử trong v1
mà không xuất hiện trong v2
. Vì vậy, bạn có thể "tái tạo" các bộ phận của v1
có trong v2
đơn giản bằng cách lập chỉ mục bởi các chỉ số khác không:
julia> v2[idxs[idxs .> 0]]
3-element Array{Int64,1}:
8
6
7
Nếu bạn nhìn vào the implementation, bạn sẽ thấy rằng nó sử dụng một từ điển để lưu trữ và tìm kiếm các các chỉ số. Điều này có nghĩa là nó chỉ tạo một đường chuyền vượt qua v1
và v2
mỗi cái, thay vì tìm kiếm qua v2
cho mọi phần tử trong v1
. Nó sẽ hiệu quả hơn nhiều trong hầu hết các trường hợp.
Nếu điều quan trọng là để phù hợp với hành vi R và trả lại chỉ số đầu tiên, chúng ta có thể cũi tắt việc thực hiện cơ sở và chỉ xây dựng từ điển ngược nên các chỉ số thấp hơn ghi đè lên những cái trở lên:
function firstindexin(a::AbstractArray, b::AbstractArray)
bdict = Dict{eltype(b), Int}()
for i=length(b):-1:1
bdict[b[i]] = i
end
[get(bdict, i, 0) for i in a]
end
julia> firstindexin([1,2,3,4], [1,1,2,2,3,3])
4-element Array{Int64,1}:
1
3
5
0
julia> indexin([1,2,3,4], [1,1,2,2,3,3])
4-element Array{Int64,1}:
2
4
6
0
http: // stackoverflow .com/questions/20102250/find-first-index-of-an-item-in-an-array-trong-julia – Khashaa