比较后如何从元胞数组中删除元素而不导致元胞数组变空?

How to delete element from cell arrays after comparisons without causing cell arrays to get empty?

我创建了一个一维数组来显示单词及其出现的句子。之后我用交集来显示哪个词与句子中其他每个剩余的词一起出现:

OccursTogether = cell(length(Out1));
for ii=1:length(Out1)
for jj=ii+1:length(Out1)
OccursTogether{ii,jj} = intersect(Out1{ii},Out1{jj});
end
end
celldisp(OccursTogether)

以上代码输出如下:

OccursTogether{1,1} =

 4 11 14

OccursTogether{1,2} =

 1
OccursTogether{1,3} =

 []
OccursTogether{1,4} =

 1 4 8 14 15 19 20 22

OccursTogether{1,5} =

 4 11

我想检查一个元素,如果它的删除不会导致空集,它应该被删除,但如果它的删除导致空集,它不应该被删除。

例如:

step1:{1,1}中删除4,{1,5}它不会为空,所以应该删除4。

step2:{1,1}中删除14并且{1,4}它不会为空所以14也应该被删除。

step3: 如果我从 {1,1}{1,5} 中删除 11 它将导致空集,因为 414 在 [=23= 中被删除] 和 step 2 所以它不应该被删除。

对数组的所有单元格进行元素删除操作。OccursTogether声明为一维单元格数组。

我如何编码以对所有 OccursTogether 元胞数组位置进行比较和删除?

使用以下内容,其中 C 代表您的 OccursTogether 单元格(更短,因此更容易阅读此答案)。代码中的注释解释了相应行的作用。

C = cell(3,2);

C{1,1} = [4 11 14];
C{2,1} = 1;
C{2,2} = [1 4 8 14 15 19 20 22];
C{3,2} = [4 11];
celldisp(C)

C = cellfun(@unique, C, 'UniformOutput', false); % remove duplicates from elements of C

numsInCell = unique([C{:}]); % numbers in cell, sorted

for n = numsInCell % loop over numbers in cell
    lSetIs1 = cellfun(@numel,C) == 1; % length of set is 1
    nInSet = cellfun(@(set) any(set==n), C); % set contains n
    nIsUnique = sum(nInSet(:))==1; % n occurs once
    condition = ~nIsUnique & ~any(nInSet(:) & lSetIs1(:)); % set neither contains n and has length of 1, nor n is unique
    if condition % if false for all sets...
        C = cellfun(@(set) set(set~=n), C, 'UniformOutput', false); % ... then remove n from all sets
    end
end

celldisp(C)

请注意,我在 for 循环中以 C = cellfun(... 开头的行中使用了逻辑索引,这为您节省了对 [=11= 元素的额外 for 循环]. MATLAB 函数 cellfun 在其第一个参数中对第二个参数中的单元格元素执行函数句柄。这是一个非常有用的工具,可以防止使用许多 for 循环甚至一些 if 语句。