gpt4 book ai didi

arrays - 在 matlab 中进行比较后从元胞数组中删除任何整数的通用方法?

转载 作者:行者123 更新时间:2023-12-01 15:49:32 26 4
gpt4 key购买 nike

这是 How to delete element from cell arrays after comparisons without causing cell arrays to get empty? 的后续问题为此我得到了部分解决方案。以下是代码:

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(不仅是 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

如您所见,414 已从给出上述结果的多个单元格中删除。我们不能删除 11,因为它会导致 {1,1}{1,5} 处出现空位置number x 删除之前。

最佳答案

我的 answer to your previous question现已更新。

我在这里复制了它:


使用以下内容,其中 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(... 开头的行中使用了逻辑索引,这为您节省了额外的 for - 循环 C 的元素。MATLAB 函数 cellfun 在其第一个参数中对第二个参数中的单元格元素执行函数句柄。这是一个非常有用的工具,可以防止使用许多 for 循环甚至一些 if 语句。

关于arrays - 在 matlab 中进行比较后从元胞数组中删除任何整数的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29345102/

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