Я пытаюсь найти быстрый способ поиска уникальных значений в массиве и удалить 0
как возможность уникального значения.Самый быстрый способ найти уникальные значения в массиве
Сейчас у меня есть два решения:
result1 = setxor(0, dataArray(1:end,1)); % This gives the correct solution
result2 = unique(dataArray(1:end,1)); % This solution is faster but doesn't give the same result as result1
dataArray
эквивалентно:
dataArray = [0 0; 0 2; 0 4; 0 6; 1 0; 1 2; 1 4; 1 6; 2 0; 2 2; 2 4; 2 6]; % This is a small array, but in my case there are usually over 10 000 lines.
Таким образом, в этом случае, result1
равно [1; 2]
и result2
равно [0; 1; 2]
. Функция unique
работает быстрее, но я не хочу 0
для рассмотрения. Есть ли способ сделать это с unique
и не считать 0
уникальным значением? Есть ли другая альтернатива?
EDIT
Я хотел время различных решений.
clc
dataArray = floor(10*rand(10e3,10));
dataArray(mod(dataArray(:,1),3)==0)=0;
% Initial
tic
for ii = 1:10000
FCT1 = setxor(0, dataArray(:,1));
end
toc
% My solution
tic
for ii = 1:10000
FCT2 = unique(dataArray(dataArray(:,1)>0,1));
end
toc
% Pursuit solution
tic
for ii = 1:10000
FCT3 = unique(dataArray(:, 1));
FCT3(FCT3==0) = [];
end
toc
% Pursuit solution with chappjc comment
tic
for ii = 1:10000
FCT32 = unique(dataArray(:, 1));
FCT32 = FCT32(FCT32~=0);
end
toc
% chappjc solution
tic
for ii = 1:10000
FCT4 = setdiff(unique(dataArray(:,1)),0);
end
toc
% chappjc 2nd solution
tic
for ii = 1:10000
FCT5 = find(accumarray(dataArray(:,1)+1,1))-1;
FCT5 = FCT5(FCT5>0);
end
toc
И результаты:
Elapsed time is 5.153571 seconds. % FCT1 Initial
Elapsed time is 3.837637 seconds. % FCT2 My solution
Elapsed time is 3.464652 seconds. % FCT3 Pursuit solution
Elapsed time is 3.414338 seconds. % FCT32 Pursuit solution with chappjc comment
Elapsed time is 4.097164 seconds. % FCT4 chappjc solution
Elapsed time is 0.936623 seconds. % FCT5 chappjc 2nd solution
Однако решение с sparse
и accumarray
работает только с integer
. Эти решения не будут работать с double
.
@chappjc Вы правы, '' ряды '' не нужны. Я удалил его. –
Возможно, вы захотите попробовать тайминги для более длинного 'dataArray', а не больше итераций. Но только для ударов, бросьте в FCT3 = FCT3 (FCT3 ~ = 0); 'поскольку это обычно быстрее, чем присваивание' [] ';. – chappjc
Согласитесь с @chappjc - ваше время во власти имеет один или два вызова функций. Попробуйте это в «большом» массиве (см. Мой ответ для примера). Вы чаще всего выполняете накладные расходы на цикл (и вызов функции) с помощью текущего кода, а не на эффективность функций, когда находитесь внутри них. – Floris