【问题标题】:Matlab: How to remove cell elements which have other sets as subsetsMatlab:如何删除具有其他集合作为子集的单元格元素
【发布时间】:2020-05-05 21:25:08
【问题描述】:

我有一个包含数组的单元格:

C = {[1,2,3,4], [3,4], [2], [4,5,6], [4,5], [7]}

我要输出:

D = {[3,4], [2], [4,5], [7]}

D 中的那些集合是唯一包含 D 中任何其他集合的集合。

类似问题请参考以下link。虽然很优雅,但我无法修改代码(还)以适应我的特定问题。

如果有任何解决方案的帮助,我将不胜感激。

谢谢!

【问题讨论】:

  • 您真的不应该链接到已删除的伪答案。链接到实际问题或您所指的正确答案。
  • 花时间尝试使优雅的解决方案适应您的需求。玩转行和列。如果您当时遇到问题,请告诉我,我会提供帮助。

标签: matlab set cell-array


【解决方案1】:

在链接的帖子中,您可以形成矩阵s,它表示所有集合对之间相似元素的数量。结果是:

C = {[1,2,3,4], [3,4], [2], [4,5,6], [4,5], [7]};
n = cellfun(@numel,C);      % find length of each element.
v = repelem(1:numel(C),n);  % generate indices for rows of the binary matrix
[~,~,u] = unique([C{:}]);   % generate indices for rows of the binary matrix
b = accumarray([v(:),u(:)],ones(size(v)),[],@max,[],true); % generate the binary matrix
s = b * b.';                % multiply by its transpose
s(1:size(s,1)+1:end) = 0;   % set diagonal elements to 0(we do not need self similarity)
result=C(~any(n(:) == s)) ;

但是矩阵可能很大,所以最好使用循环来避免内存问题:

idx=false(1,numel(C));
for k =1:numel(C)
    idx(k) = ~any(n == full(s(k, :))) ;
end
result=C(idx) ;

或遵循矢量化方法:

[r, c, v] = find(s) ;
idx = sub2ind(size(s), r, c) ;
s(idx) = v.' == n(r) ;
result = C(~any(s)) ;

【讨论】:

  • 谢谢!我今晚会试一试。看起来“s(idx) = v==(r);”可能有问题。这条线是什么意思?
  • @dsmalenb 抱歉,我没有通知您的评论。我更新了答案。 v 应该是一个行向量。
【解决方案2】:

您可以通过将每个元素与其下一个元素进行比较来简单地做到这一点,并查看是否有任何下一个元素是当前元素的子集,如果是,则删除较大的元素。这是您正在寻找的简单代码:

C = {[1,2,3,4], [3,4], [2], [4,5,6], [4,5], [7]};
% Initialize D with a copy of C
D = C; 

% Compare each element i with other elements j = i+1, i+2, ....
for i = 1:numel(C)-1
    for j = i+1:numel(C)
        % Check to see if C{j} exists in C{i}
        if contains(num2str(C{i}),num2str(C{j}))
            % Make unwanted elements empty
            D{i} = [];
        end
    end
end

% Remove empty elements
D(cellfun(@isempty,D)) = [];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多