2013-03-26 52 views
3

給定單元陣列containers.Map包含給定事件(鍵)的計數(值)的對象。我希望得到一個包含每個鍵的計數總和(作爲值)的地圖(或允許我計算計數的東西)。通過Matlab中的密鑰合併單元格陣列圖

例如:

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 

這應該工作(未經測試),但其「效率」和可讀性是可疑的至少可以說。什麼是更好的解決方案?

請注意,目前沒有歸因於事件的索引,因此使用稀疏矩陣而不是地圖很麻煩。

回答

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);