3

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

どちらが機能するか(テストされていない)ですが、その「効率」と読みやすさは控えめに言っても疑わしいものです。より良い解決策は何ですか?

現在、イベントに起因するインデックスがないため、マップの代わりにスパース行列を使用するのは面倒であることに注意してください。

4

1 に答える 1

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);
于 2013-06-04T22:57:35.173 に答える