MATLAB:根据单元格元素内的相同值组合单元格

MATLAB: combining cells based on same values within cell elements

我有一个单元格,其值如下: [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

这可能不是最有效的方法,但是……我们遍历所有未分配的元素,找到匹配项(即具有共享成员的元素),并分配组 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

您可以找到数组中所有数字的列表,逐个检查它们并合并具有该数字的所有数组:

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