比较后如何从元胞数组中删除元素而不导致元胞数组变空?
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 它将导致空集,因为 4
和 14
在 [=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
语句。
我创建了一个一维数组来显示单词及其出现的句子。之后我用交集来显示哪个词与句子中其他每个剩余的词一起出现:
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 它将导致空集,因为 4
和 14
在 [=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
语句。