如何创建键重复时将值拼接为向量的Map(哈希表)?
嘿,这个问题我之前也碰到过——MATLAB自带的containers.Map默认就是键唯一,重复赋值直接覆盖,确实没法直接实现同键值拼接。这里有几个实用且高效的方案,你可以根据自己的需求选:
方案1:手动扩展containers.Map功能,循环处理键值对
这个方法最直观,也最灵活,不管你的键是字符串、数值还是其他合法类型都能用上:
% 初始化空Map,指定键类型为char,值类型设为any(方便存向量) myMap = containers.Map('KeyType','char','ValueType','any'); % 模拟你的待添加键值对(比如键'333'对应327.2和69.9) keyValuePairs = {'333',327.2; '111',100; '333',69.9}; for i = 1:size(keyValuePairs,1) currentKey = keyValuePairs{i,1}; currentValue = keyValuePairs{i,2}; if isKey(myMap, currentKey) % 键已存在,把新值追加到已有向量末尾 existingVals = myMap(currentKey); myMap(currentKey) = [existingVals, currentValue]; else % 键不存在,直接存为单个元素的向量 myMap(currentKey) = currentValue; end end % 测试输出:会得到 [327.2, 69.9] disp(myMap('333'));
方案2:用结构体实现(语法更简洁)
如果你的键都是合法的MATLAB变量名(比如你例子里的数字字符串'333'),用结构体的语法会更清爽:
myStruct = struct(); keyValuePairs = {'333',327.2; '111',100; '333',69.9}; for i = 1:size(keyValuePairs,1) currentKey = keyValuePairs{i,1}; currentValue = keyValuePairs{i,2}; if isfield(myStruct, currentKey) myStruct.(currentKey) = [myStruct.(currentKey), currentValue]; else myStruct.(currentKey) = currentValue; end end % 测试输出:同样得到 [327.2, 69.9] disp(myStruct.333);
方案3:向量化批量处理(大数据量首选)
如果你的数据量很大,循环的效率会有点低,这时候用unique+accumarray的向量化方案会快很多:
% 把键和值分别提取为独立数组 keysList = {'333','111','333'}; valuesList = [327.2, 100, 69.9]; % 将字符串键转换为数值索引,方便accumarray分组 [uniqueKeys, ~, groupIdx] = unique(keysList); % 用accumarray把同组的值打包成向量(存为cell数组) groupedVals = accumarray(groupIdx, valuesList, [], @(x) {x}); % 可选:把结果转成Map,方便按键查找 resultMap = containers.Map(uniqueKeys, groupedVals); % 测试输出:注意这里返回的是cell数组,需要用花括号取出向量 disp(resultMap('333'){1});
各方案适用场景
- 方案1:适合键类型复杂(比如非变量名字符串、数值键),或者需要随时动态添加键值对的场景;
- 方案2:适合键是合法变量名的情况,语法更简洁易读;
- 方案3:适合批量处理大量数据,向量化操作比循环效率高得多。
内容的提问来源于stack exchange,提问作者Phibins
相关产品推荐
相关产品推荐

