在 matlab 中进行比较后从元胞数组中删除任何整数的通用方法?
Generalized method for deletion of any integer from cell arrays after comparisons in matlab?
这是 的后续问题,我得到了部分解决方案。以下是代码:
A = cell(2);
A{1} = [2 4];
A{3} = [3 2 0];
A{4} = 1;
celldisp(A) % A contains one 2, an empty cell, a double array and a 1.
AWithout2ButNotEmptied = cellfun(@(x) x( (x~=2) | (numel(x)<2) ), A,'UniformOutput', false);
celldisp(AWithout2ButNotEmptied)
以上代码的输出是:
A{1,1} =
2 4
A{2,1} =
[]
A{1,2} =
3 2 0
A{2,2} =
1
AWithout2ButNotEmptied{1,1} =
4
AWithout2ButNotEmptied{2,1} =
[]
AWithout2ButNotEmptied{1,2} =
3 0
AWithout2ButNotEmptied{2,2} =
1
输出显示A{1,1}
等于4
,删除2
后不清空,因为它的长度小于二(其长度为一)。 A{1,2}
删除了等于 2 的元素。 A{2,1}
已经为空,保持不变。 A{2,2}
的长度为1,但不等于2,所以也保持不变 所以只检查2
号是否被删除
如果此代码不会导致任何其他数组变为空,我该如何更改此代码以从任何单元格元素中删除任何数字 x(not only 2)
。
我想对单元格中 x(1,...,n)
的任何值执行此操作我不想删除任何特定数字,它可以是单元格数组中的任何数字 x
。
例如:
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
我要的结果如下;
OccursTogether{1,1} =
11
OccursTogether{1,2} =
1
OccursTogether{1,3} =
[]
OccursTogether{1,4} =
1 8 15 19 20 22
OccursTogether{1,5} =
11
如您所见,4
和 14
已从多个单元格中删除,从而给出了上述结果。我们不能删除 11
,因为它会导致 {1,1}
和 {1,5}
处出现空位置,在删除它之前,应该对每个数字 x
应用相同的检查。
我的现在更新了。
我复制到这里:
使用以下内容,其中 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
语句。
这是
A = cell(2);
A{1} = [2 4];
A{3} = [3 2 0];
A{4} = 1;
celldisp(A) % A contains one 2, an empty cell, a double array and a 1.
AWithout2ButNotEmptied = cellfun(@(x) x( (x~=2) | (numel(x)<2) ), A,'UniformOutput', false);
celldisp(AWithout2ButNotEmptied)
以上代码的输出是:
A{1,1} =
2 4
A{2,1} =
[]
A{1,2} =
3 2 0
A{2,2} =
1
AWithout2ButNotEmptied{1,1} =
4
AWithout2ButNotEmptied{2,1} =
[]
AWithout2ButNotEmptied{1,2} =
3 0
AWithout2ButNotEmptied{2,2} =
1
输出显示A{1,1}
等于4
,删除2
后不清空,因为它的长度小于二(其长度为一)。 A{1,2}
删除了等于 2 的元素。 A{2,1}
已经为空,保持不变。 A{2,2}
的长度为1,但不等于2,所以也保持不变 所以只检查2
号是否被删除
如果此代码不会导致任何其他数组变为空,我该如何更改此代码以从任何单元格元素中删除任何数字 x(not only 2)
。
我想对单元格中 x(1,...,n)
的任何值执行此操作我不想删除任何特定数字,它可以是单元格数组中的任何数字 x
。
例如:
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
我要的结果如下;
OccursTogether{1,1} =
11
OccursTogether{1,2} =
1
OccursTogether{1,3} =
[]
OccursTogether{1,4} =
1 8 15 19 20 22
OccursTogether{1,5} =
11
如您所见,4
和 14
已从多个单元格中删除,从而给出了上述结果。我们不能删除 11
,因为它会导致 {1,1}
和 {1,5}
处出现空位置,在删除它之前,应该对每个数字 x
应用相同的检查。
我的
我复制到这里:
使用以下内容,其中 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
语句。