У меня есть 2 больших массива A
и b
:
A
: 10.000 ++ строк, 4 столбца, не уникальные целые числа
b
: вектор с 500.000 ++ элементами, уникальные целые числа
Из-за уникальности значений b
мне нужно найти единственный индекс b
, где A(i,j) == b
.
С чего я начал, это
[rows,columns] = size(A);
B = zeros(rows,columns);
for i = 1 : rows
for j = 1 : columns
B(i,j) = find(A(i,j)==b,1);
end
end
Это займет около 5,5 секунд , чтобы вычислить, что очень долго, поскольку A
и b
могут быть значительно больше ... Я думал, что пытался ускоритькод с помощью логического индексирования и сокращения циклов for
[rows,columns] = size(A);
B = zeros(rows,columns);
for idx = 1 : numel(b)
B(A==b(idx)) = idx;
end
К сожалению, это занимает еще больше времени: 21 секунд
Я даже пытался использовать bsxfun
for i = 1 : columns
[I,J] = find(bsxfun(@eq,A(:,i),b))
... stitch B together ...
end
, но с большими массивами максимальный размер массива быстро превышается (102,9 ГБ ...).
Можете ли вы помочь мне найти более быстрое решение для этого?Заранее спасибо!
РЕДАКТИРОВАТЬ: я расширил find(A(i,j)==b
,1
)
, что ускоряет алгоритм в 2 раза!Спасибо, но в целом все еще слишком медленно ...;)