我有一个像以下值的单元格: [1,2] [4,5] [2,8] [1,9] [5,2] [6,7] 我想转换为: [1,2,4,5,8,9] [6,7] 基本上,当一个元素中的一个值等于另一个元素元素值时,我希望两个元素组合成一个新元素......以及任何其他元素,其值等于该元素中的任何值...所以[1 ,2]会吸收[2,5],这反过来会吸收[4,5]。
到目前为止我有下面的代码,它似乎至少创建了包含完整组(1,2,4,5,8,9)的元素,但也包含部分元素和重复项(1,2)(1) ,2,4),等等。并且不包含没有类似价值伙伴的元素(6,7)。有什么建议?感谢
TooClose2=[];
for i=1:length(TooClose)
TooClose2temp=[];
for j=1:length(TooClose)
if i~=j
for h=1:length(TooClose{i})
if TooClose{i}(h)==TooClose{j}(h)
TooClose2temp(end+1)=TooClose{j}(1);
TooClose2temp(end+1)=TooClose{j}(2);
end
end
end
end
TooClose2{end+1}=TooClose2temp;
end
答案 0 :(得分:1)
这可能不是最有效的方法,但是......我们遍历所有未分配的元素,查找匹配项(即具有共享成员的元素),并分配组ID(请参阅注释)。最后,从这些组ID中迭代地构造输出单元。注意,此算法应适用于单元格elements
,其中元素具有任意长度。
一个明显的改进是让辅助函数只查看索引大于current_i
的元素。
function [unified_elements, groups] = findGroups(elements)
groups = zeros(size(elements));
%// Find matches for unassigned elements
for ii = 1:numel(groups)
if groups(ii) == 0
groups = fe(ii, elements, groups);
end
end
%// Loop over all groups ...
u_groups = unique(groups);
n_groups = numel(u_groups);
unified_elements = cell(1, n_groups);
for i_group = 1:n_groups
g_id = u_groups(i_group);
%// ... and iterativeliy add the elements from that group to unified_elements
for el = elements(groups==g_id)
unified_elements{i_group} = union(unified_elements{i_group}, el{1});
end
end
end
%// Helper function that finds elements with shared members for a given element
%// If any of those elements with shared members has a group assigned, assign
%// it to all matches. Otherwise, use new group ID.
function groups = fe(current_i, elements, groups)
next_g = numel(unique(groups));
dc = cellfun(@(c) numel(intersect(c, elements{current_i})) > 0, elements);
matching_groups = groups(dc);
if any(matching_groups)
groups(dc) = matching_groups(find(matching_groups, 1));
else
groups(dc) = next_g;
end
end
答案 1 :(得分:0)
您可以找到阵列中所有数字的列表逐个浏览并合并所有具有该数字的数组:
C=unique(cell2mat(A));
for k=1:numel(C)
I = find(cellfun(@(x) ismember(C(k), x), A));
if numel(I)>1
A{I(1)} = unique(cell2mat(A(I)));
A(I(2:end)) = [];
end
end