gpt4 book ai didi

arrays - 如何删除作为较大元素子集的单元格元素? (Matlab)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:11 25 4
gpt4 key购买 nike

例如,如果我有一个单元格,里面列出了数组:

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

我要输出:

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

删除已经包含在另一个较大元素中/子集的单元格元素的最有效方法是什么?

我现有的算法遍历每个元素,将其与新单元格列表中的每个元素进行比较,并相应地更新新单元格列表,但它非常缓慢且效率低下(我的原始单元格包含 >200 个数组元素)。

最佳答案

这是一种使用非常快速的矩阵乘法的方法。您可以将 C 转换为稀疏二进制矩阵 bC 的每个元素都与矩阵的每一行相关。因此,第一行的 [1 2 3 4] 列和第二行的 [3 4] 列都设置为 1,依此类推。将矩阵乘以其转置,我们可以找到所有行对之间对应元素的数量。使用该信息,我们可以找到属于其他元素子集的单元格元素。

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(max(s)<n) % remove an element if it is a subset and preserve others

关于arrays - 如何删除作为较大元素子集的单元格元素? (Matlab),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46859164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com