2016-11-28 4 views
4

Я использую язык программирования Джулию, и я знаю, что вы можете использовать функции поиска следующим образом:() с двумя векторами

a = [ 1 2 3 4 3 5 3 6 7 8 9 3 ] 
find(a .== 3) 

Он вернется: 3, 5, 7, 12

Прост достаточно.

Однако, мой вопрос в том, что, если мы хотим заменить 3 в приведенном выше коде как вектор.

Например:

a = [1 2 3 4 5 6 7] 
b = [1 9 5 8] 

Следующий синтаксис не работает для меня, но он передает свою идею. Как бы сделать следующий правильно ?:

find (a .== b) 

Если мы хотим, чтобы вернуть 1, 3?

Я знаю, что функция соответствия в R делает это хорошо, но у меня очень большой набор данных, и R не справляется с этим хорошо.

+1

почему не возвращаются 1,5? –

ответ

7

Другой способ - использование функции findin/2:

julia> findin(b,a) 
2-element Array{Int64,1}: 
1 
3 

julia> findin(a,b) 
2-element Array{Int64,1}: 
1 
5 
+0

Ницца, я забыл об этом. – DNF

+1

Странно, я считаю, что моя версия более чем в 10 раз быстрее, чем ваша на Julia 0.5 !? Можете ли вы это подтвердить? – DNF

+0

@DNF, я новичок в Julia, поэтому я тоже хотел бы знать =) –

5

Вы можете сделать это:

julia>> find(x->x in b, a) 
2-element Array{Int64,1}: 
1 
5 

или так как вы хотели 1, 3:

julia> find(x->x in a, b) 
2-element Array{Int64,1}: 
1 
3 

Я также полагаю, что вы используете

a = [1, 2, 3, 4, 5, 6, 7] 
b = [1, 9, 5, 8] 

вместо версии без запятых, т.к. операции столбцов более эффективны, чем операции с рядами в Julia.

Кроме того, более эффективно писать find(x->x==3, a) чем find(a.==3), поскольку последний будет первым создать полную булеву вектор, а затем искать, что, в то время как первый будет просто перебирать каждый элемент a и выполнить сравнение.

Редактировать: Если вам интересно узнать анонимную функцию, вам необходимо обратиться за помощью к функции find. Дело в том, что

find(f, a) 

применяет функцию f к каждому элементу a перед тем пока он оценивает find часть.