在Matlab中存储词典的最有效方法

时间:2016-09-08 07:51:57

标签: matlab hashmap

我有一组与费用相关的ID,这只是一个双倍价值。 ID是整数且唯一。两个ID可能具有相同的成本。我将它们存储为: -

a=containers.Map('KeyType','uint32','ValueType','double');
a(1)=7.3
a(2)=8.4
a(3)=7.3

现在我想找到最低费用。

b=[];
c=values(a);
b=[b,c{:}];
cost_min=min(b);

现在我想找到所有相关的ID,即1和3,最低成本即7.3。我可以将所有键收集到一个数组中,然后对该数组进行for循环。有没有更好的方法在Matlab中完成这一切,以便不需要for循环?

2 个答案:

答案 0 :(得分:2)

稀疏矩阵可以作为哈希映射,只需这样做:

a= sparse(1:3,1,[7.3 8.4 7.3])
find(a == min(nonzeros(a))

答案 1 :(得分:0)

有些方法可以在地图上用于此类操作

http://se.mathworks.com/help/matlab/ref/containers.map-class.html

找到最小值和最小键的方法可以这样做,

a=containers.Map('KeyType','uint32','ValueType','double');
a(1)=7.3;
a(3)=8.4;
a(4)=7.3;

minval = inf;
minkeys = -1;
for k = keys(a)
    val = a.values(k);
    val = val{1};
    if (val < minval(1))
        minkeys = k;
        minval = val;
    elseif (val == minval(1))
        minkeys = [minkeys,k];
    end
end

disp(minval);
disp(minkeys);

虽然效率不高,但价值搜索对地图来说也很笨拙。这不是他们的目的。地图应该进行有效的密钥查找。如果你要进行大量的查找,这需要花费时间,然后使用地图。如果您需要进行大量的值搜索,我建议您使用矩阵(或两个数组)代替。

idx = [1;3;4];
val = [7.3,8.3,7.3];
minval = min(val);
minidx = idx(val==minval);
disp(minval);
disp(minidx);

还有另一篇文章,其中展示了如何将稀疏矩阵用作散列图。让索引成为关键。这将占用大约3倍的内存,因为所有非零元素都是普通数组,但是地图使用的内存也比数组多。