2015-06-07 3 views
4

Предположим, у меня есть buffer=Int[1,2,3,2,3] и token=[2,3]. Есть ли какой-либо предпочтительный способ поиска вхождения token в buffer, чтобы найти [2,4] в качестве ответа.Julia способ поиска маркеров в целых массивах

Или, возможно, есть ли какая-либо split эквивалентная функция для целых массивов в julia?

(я знаю, как я могу выполнить эту операцию с помощью 2 вложенных циклов. Тем не менее, я особенно интересно, если есть более Julian способ сделать это.)

ответ

3

На практике я также методом проб и ошибок, и следующие модели работали Julia0.4.0. С A = Int[1,2,3,2,3] и pat = Int[2,3], первый из них

x = Int[ A[i:i+1] == pat ? i : 0 for i=1:length(A)-1 ] 
x[ x .> 0 ] # => [2,4] 

второй является

x = Int[] 
[ A[i:i+1] == pat ? push!(x,i) : 0 for i=1:length(A)-1 ] 
@show x  # => [2,4] 

, а третий является

find([ A[i:i+1] == pat for i=1:length(A)-1 ]) # => [2,4] 

(где find() возвращает индекс массива истинных элементов) , Но лично я чувствую, что эти шаблоны больше похожи на python, чем на julia ...

4

Потому что Джулия не условная в списковых , Я лично использовал бы filter(). Таким образом, если arr = Int64[1,2,3,4,5,2,3,6,2,3,3,2,2]:

filter(x -> arr[x] == 2 && arr[x + 1] == 3, 1 : length(arr) - 1) 

=> [2,6,9] 

Чтобы сделать его немного более многоразовые:

pat = [2,3] 

filter(x -> arr[x : x + length(pat) - 1] == pat, 1 : length(arr) - length(pat) + 1) 

=> [2,6,9] 

Юлия имеет встроенные модули, как find([fun], A), но нет никакого способа, которым я знаю, чтобы использовать их, чтобы вернуться индексы упорядоченного подсписка.

Конечно, это возможно, более разборчивыми просто

ndxs = Int64[] 

for i = 1:length(arr)-1 
    if arr[i] == 2 && arr[i+1] == 3 
    push!(ndxs, i) 
    end 
end 

=> [2,6,9] 
Смежные вопросы