如何删除作为较大元素子集的单元格元素? (Matlab)
How to remove cell elements that are a subset of a larger element? (Matlab)
例如,如果我有一个单元格,其中列出了数组:
C = {[1,2,3,4], [3,4], [2], [4,5,6], [4,5], [7]}
我要输出:
D = {[1,2,3,4], [4,5,6], [7]}
删除已经 included/subset 在另一个更大的元素中的单元格元素的最有效方法是什么?
我现有的算法遍历每个元素,将其与新单元格列表中的每个元素进行比较并相应地更新新单元格列表,但它非常缓慢且效率低下(我的原始单元格包含 >200 个数组元素)。
这是一种使用非常快速的矩阵乘法的方法。您可以将 C
转换为稀疏二进制矩阵 b
,C
的每个元素都与矩阵的每一行相关。因此,第一行的 [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
例如,如果我有一个单元格,其中列出了数组:
C = {[1,2,3,4], [3,4], [2], [4,5,6], [4,5], [7]}
我要输出:
D = {[1,2,3,4], [4,5,6], [7]}
删除已经 included/subset 在另一个更大的元素中的单元格元素的最有效方法是什么?
我现有的算法遍历每个元素,将其与新单元格列表中的每个元素进行比较并相应地更新新单元格列表,但它非常缓慢且效率低下(我的原始单元格包含 >200 个数组元素)。
这是一种使用非常快速的矩阵乘法的方法。您可以将 C
转换为稀疏二进制矩阵 b
,C
的每个元素都与矩阵的每一行相关。因此,第一行的 [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