Есть ли способ реализовать очередь мин / макс? - PullRequest
1 голос
/ 07 февраля 2012

В настоящее время я запускаю скрипт, использующий сортировку для выбора k минимумов, но он довольно медленный, когда данные большие.

Так что я думаю, что мне нужно выбрать только k строк на основе определенного столбца данной матрицы с минимальной / максимальной очередью. Есть ли способ сделать это в Matlab?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Я не знаю что-то вроде очереди приоритетов, которая является родной для Matlab. Есть реализация mex-файла одного на обмене файлами Matlab, или, по-видимому, вы делаете это с Java - см. этот вопрос о переполнении стека и этот вопрос на форумах Matlab .

Это очень вам поможет, если вам часто приходится вставлять и удалять элементы вашего списка. Если вы можете поместить все свои элементы одновременно и просто отсортировать в конце, это может быть так же быстро, как и использование очереди с приоритетами. Вероятно, это зависит от деталей того, что вы делаете.

2 голосов
/ 07 февраля 2012

Я думал о том, чтобы находить M минимальные значения одно за другим и удалять найденные минимальные значения после каждой итерации, но это медленнее, попробуйте мой тест:

elements = 1e4;
runs = 20;
numMin = 30;
dat = rand(elements, 1);

tic
for i = 1:runs
    d = sort(dat);
    mins1 = d(1:numMin);
end
t1 = toc/runs

tic
for i = 1:runs
    mins2 = zeros(numMin, 1);
    d = dat;
    for j = 1:numMin
        [val, idx] = min(d);
        mins2(j) = val;
        d(idx) = [];
    end
end
t2 = toc/runs

isequal(mins1, mins2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...