给定包含给定事件(键)计数(值)的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
它应该有效(未经测试),但其“效率”和可读性至少值得怀疑什么是更好的解决方案?
请注意,目前没有归因于事件的索引,因此使用稀疏矩阵代替映射是很麻烦的。
最佳答案
不确定可读性,但可能更有效:
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);