有没有办法实现最小/最大队列?

时间:2012-02-07 14:38:26

标签: matlab

目前,我正在运行一个使用sort来选择k个最小值的脚本,但是当数据量很大时它很慢。

所以我认为我需要根据具有最小/最大队列的给定矩阵的某一列仅选择k行。有没有办法在matlab中做到这一点?

2 个答案:

答案 0 :(得分:2)

我考虑过一个接一个地找到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)

答案 1 :(得分:2)

我不知道类似于matlab原生的优先级队列。那是一个 在Matlab文件交换中有一个mex-file implementation,或者显然是用Java做的 - 请参阅this question on stack overflowthis question on the Matlab forums

如果您经常需要插入和删除列表中的元素,那么这只会对您有所帮助。如果您可以一次性放入所有元素并在最后排序,则可能与使用优先级队列一样快。这可能取决于你正在做什么的细节。