Matlab中如何将cell数组的node_ID与对应name关联生成矩阵?
解决MATLAB中Cell数组按node_ID关联name的问题
我明白你的需求了——你有一个<1×313 cell>的cell数组c_infos,每个元素都包含node_ID和对应的name字段,现在想把同一个node_ID对应的所有name整理到一起,但之前写的代码把所有name都混进了一个一维数组,完全没法区分它们属于哪个node_ID对吧?
先说说你原来代码的问题:嵌套循环会把所有匹配的name都塞进list里,但不仅会重复添加(比如i=1时会把所有同ID的name加一遍,i=2时又会再加一次),而且没有保留node_ID的对应关系,最后得到的只是一堆无归属的name,完全达不到你的目的。
下面给你两种实用的解决方案,都能清晰地把node_ID和对应的name列表绑定起来:
方案一:用结构体数组存储对应关系
这种方式直观易懂,每个结构体元素对应一个node_ID和它的所有关联name:
function [] = displayNodeCusts(c_infos) % 提取所有node_ID并去重,得到唯一的ID列表 all_node_ids = [c_infos{:}.node_ID]; unique_node_ids = unique(all_node_ids); % 初始化结果结构体数组,每个元素包含node_ID和names字段 node_custs = struct('node_ID', [], 'names', []); for k = 1:length(unique_node_ids) current_id = unique_node_ids(k); % 找到所有node_ID等于当前ID的元素索引 match_idx = find([c_infos{:}.node_ID] == current_id); % 提取对应的name,存为cell数组 current_names = {c_infos{match_idx}.name}; % 把ID和name列表存入结构体 node_custs(k).node_ID = current_id; node_custs(k).names = current_names; end % 打印结果(也可以直接返回node_custs供后续使用) disp('=== 每个node_ID对应的name列表 ==='); for k = 1:length(node_custs) fprintf('node_ID: %d\n关联的name: %s\n\n', ... node_custs(k).node_ID, ... strjoin(node_custs(k).names, ', ')); end end
代码说明:
- 先把所有
node_ID提取出来并去重,确保每个ID只处理一次; - 遍历每个唯一ID,找到所有匹配的元素,把它们的
name收集成cell数组; - 最后把
node_ID和对应的name列表存入结构体数组,这样每个条目都有明确的归属,不会混乱。
方案二:用containers.Map(键值对容器)
如果需要后续快速通过node_ID查找对应的name,用containers.Map会更方便,它本质是一个键值对集合,键是node_ID,值是对应的name列表:
function [] = displayNodeCusts(c_infos) % 初始化Map,键为double类型(对应node_ID),值为任意类型 node_map = containers.Map('KeyType', 'double', 'ValueType', 'any'); for i = 1:length(c_infos) current_id = c_infos{1,i}.node_ID; current_name = c_infos{1,i}.name; if isKey(node_map, current_id) % 如果已存在该ID,就把当前name追加到列表中 node_map(current_id) = [node_map(current_id), current_name]; else % 如果不存在,就新建一个条目,存入第一个name node_map(current_id) = {current_name}; end end % 遍历打印结果 disp('=== 每个node_ID对应的name列表 ==='); all_keys = keys(node_map); for k = 1:length(all_keys) current_id = str2double(all_keys{k}); current_names = node_map(current_id); fprintf('node_ID: %d\n关联的name: %s\n\n', ... current_id, strjoin(current_names, ', ')); end end
代码说明:
- 遍历一次
c_infos数组即可完成所有name的归类; - 遇到已存在的
node_ID就追加name,不存在则新建条目; - 后续如果需要查找某个ID的name,直接用
node_map(target_id)就能快速获取,不需要再遍历数组。
这两种方案都能完美解决你的问题,你可以根据自己的后续需求选择:如果需要按顺序遍历所有ID和name,选结构体数组;如果需要快速查找,选containers.Map就好。
内容的提问来源于stack exchange,提问作者ssjss7
相关产品推荐
相关产品推荐

