В каком массиве мы можем найти элементы в Юлии? - PullRequest
0 голосов
/ 28 июня 2018

Представьте, что у нас есть следующий массив из 3 массивов, охватывающий диапазон от 1 до 150:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ... 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]

[51, 52, 53, 54, 55, 56, 57, 58, 59, 60 ... 92, 93, 94, 95, 96, 97, 98, 99, 100, 107]

[71, 73, 84, 101, 102, 103, 104, 105, 106, 108 ... 141, 142, 143, 144, 145, 146, 147, 148, 149, 150]

Я хочу построить массив, в котором хранится, в каком массиве мы находим значения от 1 до 150. Результат должен быть тогда:

[1 1 1 ... 1 2 2 2 ... 2 3 2 3 2 ... 3 3 3 ... 3]

, где каждый элемент соответствует 1, 2, 3, ..., 150. Полученный массив дает массив-членство элементов от 1 до 150. Код должен применяться для любого количества массивов (т.е. не только для 3 массивов).

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Обмен памяти для поиска в этом случае:

  • Создайте array, чтобы записать, в каком array содержится каждое значение.
# example arrays
N=100; A=rand(1:N,30);
B = rand(1:N,40);
C = rand(1:N,35);
# record array containing each value: 
A=1,B=2,C=3; 
not found=0;
arrayin = zeros(Int32, max(maximum(A),maximum(B),maximum(C))); 
arrayin[A] .= 1; 
arrayin[B] .= 2; 
arrayin[C] .=3;

0 голосов
/ 28 июня 2018

Вы можете использовать понимание массива . Вот пример с тремя векторами, содержащими диапазон 1:10:

A = [1, 3, 4, 5, 7]
B = [2, 8, 9]
C = [6, 10]

Теперь мы можем написать понимание, используя in с резервной ошибкой для защиты:

julia> [x in A ? 1 : x in B ? 2 : 3 for x in 1:10]
10-element Array{Int64,1}:
 1
 ⋮
 3

Возможно также включить резервную ошибку, если ввод неправильный

julia> [x in A ? 1 : x in B ? 2 : x in C ? 3 : error("not found") for x in 1:10]
10-element Array{Int64,1}:
 1
 ⋮
 3
...