在Matlab中按键合并单元格的数组

时间:2013-03-26 22:22:38

标签: matlab

给定containers.Map个对象的单元格数组,其中包含给定事件(键)的计数(值)。我想得到一个包含每个键的计数总和(作为值)的单个地图(或允许我计算计数的东西)。

例如:

maps = { containers.Map({'a','b'},{1,2}),
         containers.Map({'b','c'},{4,1}) };

mergeMaps(maps)

  ans = Map(a -> 1, b -> 6, c -> 1)

到目前为止我唯一能想到的是:

maps = { ... };
res = containers.Map();
for cMapC = maps
    cMap = cMapC{1};
    for cKeyC = keys(cMap{1})
        cKey = cKeyC{1};
        if isKey(res, cKey)
            res(cKey) = res(cKey) + cMap(cKey);
        else
            res(cKey) = cMap(cKey);
        end
    end
end

哪个应该有效(未经测试),但其“效率”和可读性至少可以说是有问题的。什么是更好的解决方案?

请注意,目前没有归因于事件的索引,因此使用稀疏矩阵代替地图非常麻烦。

1 个答案:

答案 0 :(得分:5)

不确定可读性,但可能效率更高:

allKeys0   = cellfun(@keys, maps, 'UniformOutput', false);
[allKeys, ~, m] = unique([allKeys0{:}]);
allValues0 = cellfun(@values, maps, 'UniformOutput', false);
allValues = cell2mat([allValues0{:}]);
sumValues = arrayfun(@(x) sum(allValues(m==x)), 1:numel(allKeys));

mergedMap = containers.Map(allKeys, sumValues);