Arrays MATLAB:删除for循环中单元格数组中的元素

Arrays MATLAB:删除for循环中单元格数组中的元素,arrays,matlab,cell-array,Arrays,Matlab,Cell Array,如何在for循环中删除单元格数组中的元素? l有一个称为stated_n{i}的集合,其中i从1变化到n(设n=5),例如: stated_n{1} = {3,7,8,9,14,99} stated_n{2} = {14,8,19,104,98} stated_n{3} = {67,7,8,9,14,11} stated_n{4} = {41,76,8,18,14,56} stated_n{5} = {65,13,16,9,8,103} 例如,我想从每个陈述的n{i}中删除一个值k(

如何在for循环中删除单元格数组中的元素? l有一个称为stated_n{i}的集合,其中i从1变化到n(设n=5),例如:

stated_n{1} = {3,7,8,9,14,99} 
stated_n{2} = {14,8,19,104,98} 
stated_n{3} = {67,7,8,9,14,11} 
stated_n{4} = {41,76,8,18,14,56} 
stated_n{5} = {65,13,16,9,8,103} 
例如,我想从每个陈述的n{i}中删除一个值k(让k=8)。如何从每个陈述的n(1:5)中删除8


下面是一种使用
find
cell2mat
的方法

其思想是将每个单元格转换为数字矩阵,并使用
find
查找出现
k
的索引。然后删除这些条目。如果
k
的实例超过1个,该方法也有效

clear
clc

stated_n{1} = {3,7,8,9,14,99} ;
stated_n{2} = {14,8,19,104,98} ;
stated_n{3} = {67,7,8,9,14,11} ;
stated_n{4} = {41,76,8,18,14,56} ;
stated_n{5} = {65,13,16,9,8,103} ;

N = numel(stated_n);
k = 8;
for i=1:N 

    idx = find(cell2mat(stated_n{i}) == k);

    stated_n{i}(idx) = [];

   %// Display

   stated_n{i}
end
输出:

ans = 

    [3]    [7]    [9]    [14]    [99]


ans = 

    [14]    [19]    [104]    [98]


ans = 

    [67]    [7]    [9]    [14]    [11]


ans = 

    [41]    [76]    [18]    [14]    [56]


ans = 

    [65]    [13]    [16]    [9]    [103]

下面是一种使用
find
cell2mat
的方法

其思想是将每个单元格转换为数字矩阵,并使用
find
查找出现
k
的索引。然后删除这些条目。如果
k
的实例超过1个,该方法也有效

clear
clc

stated_n{1} = {3,7,8,9,14,99} ;
stated_n{2} = {14,8,19,104,98} ;
stated_n{3} = {67,7,8,9,14,11} ;
stated_n{4} = {41,76,8,18,14,56} ;
stated_n{5} = {65,13,16,9,8,103} ;

N = numel(stated_n);
k = 8;
for i=1:N 

    idx = find(cell2mat(stated_n{i}) == k);

    stated_n{i}(idx) = [];

   %// Display

   stated_n{i}
end
输出:

ans = 

    [3]    [7]    [9]    [14]    [99]


ans = 

    [14]    [19]    [104]    [98]


ans = 

    [67]    [7]    [9]    [14]    [11]


ans = 

    [41]    [76]    [18]    [14]    [56]


ans = 

    [65]    [13]    [16]    [9]    [103]

下面是一种使用
find
cell2mat
的方法

其思想是将每个单元格转换为数字矩阵,并使用
find
查找出现
k
的索引。然后删除这些条目。如果
k
的实例超过1个,该方法也有效

clear
clc

stated_n{1} = {3,7,8,9,14,99} ;
stated_n{2} = {14,8,19,104,98} ;
stated_n{3} = {67,7,8,9,14,11} ;
stated_n{4} = {41,76,8,18,14,56} ;
stated_n{5} = {65,13,16,9,8,103} ;

N = numel(stated_n);
k = 8;
for i=1:N 

    idx = find(cell2mat(stated_n{i}) == k);

    stated_n{i}(idx) = [];

   %// Display

   stated_n{i}
end
输出:

ans = 

    [3]    [7]    [9]    [14]    [99]


ans = 

    [14]    [19]    [104]    [98]


ans = 

    [67]    [7]    [9]    [14]    [11]


ans = 

    [41]    [76]    [18]    [14]    [56]


ans = 

    [65]    [13]    [16]    [9]    [103]

下面是一种使用
find
cell2mat
的方法

其思想是将每个单元格转换为数字矩阵,并使用
find
查找出现
k
的索引。然后删除这些条目。如果
k
的实例超过1个,该方法也有效

clear
clc

stated_n{1} = {3,7,8,9,14,99} ;
stated_n{2} = {14,8,19,104,98} ;
stated_n{3} = {67,7,8,9,14,11} ;
stated_n{4} = {41,76,8,18,14,56} ;
stated_n{5} = {65,13,16,9,8,103} ;

N = numel(stated_n);
k = 8;
for i=1:N 

    idx = find(cell2mat(stated_n{i}) == k);

    stated_n{i}(idx) = [];

   %// Display

   stated_n{i}
end
输出:

ans = 

    [3]    [7]    [9]    [14]    [99]


ans = 

    [14]    [19]    [104]    [98]


ans = 

    [67]    [7]    [9]    [14]    [11]


ans = 

    [41]    [76]    [18]    [14]    [56]


ans = 

    [65]    [13]    [16]    [9]    [103]

要删除单个值,请执行以下操作:

k = 8;
result = cellfun(@(x) x([x{:}]~=k), stated_n, 'uniformoutput', 0);
要删除多个值,请执行以下操作:

k = [8 4];
result = cellfun(@(x) x(~ismember([x{:}], k)), stated_n, 'uniformoutput', 0);

要删除单个值,请执行以下操作:

k = 8;
result = cellfun(@(x) x([x{:}]~=k), stated_n, 'uniformoutput', 0);
要删除多个值,请执行以下操作:

k = [8 4];
result = cellfun(@(x) x(~ismember([x{:}], k)), stated_n, 'uniformoutput', 0);

要删除单个值,请执行以下操作:

k = 8;
result = cellfun(@(x) x([x{:}]~=k), stated_n, 'uniformoutput', 0);
要删除多个值,请执行以下操作:

k = [8 4];
result = cellfun(@(x) x(~ismember([x{:}], k)), stated_n, 'uniformoutput', 0);

要删除单个值,请执行以下操作:

k = 8;
result = cellfun(@(x) x([x{:}]~=k), stated_n, 'uniformoutput', 0);
要删除多个值,请执行以下操作:

k = [8 4];
result = cellfun(@(x) x(~ismember([x{:}], k)), stated_n, 'uniformoutput', 0);

细微的挑剔:实际上不需要检查是否有空;如果索引变量为空,则它是一个自动no-op.mh,因此
邻居\u n
不是一个单元格。如果您删除对
cell2mat
的调用,然后使用常规矩阵索引,该怎么办?它在我的情况下不起作用(在for循环中)。它返回我:???来自非单元格数组对象的单元格内容引用。43 cellclass=class(c{1})处的==>cell2mat错误;在114 idx=find(cell2mat(neighbor_n{i})==k)处的==>broadcastelimination中出错;N=努梅尔(N);对于k=1:N对于i=1:N如果(ismember(k,stated_N{i}));idx=find(cell2mat(stated_n{i})==k);陈述的{i}(idx)=[];如何做到这一点benoit 你试过我发布的代码了吗?您有两个for循环和一个循环,循环增量为
k
,这与上面使用的
k
相冲突。您不需要将
ismember…
与我使用的
find
函数一起使用。请看我上面的评论
Neighbor\u n
不是一个小小的吹毛求疵:实际上不需要检查空白;如果索引变量为空,则它是一个自动no-op.mh,因此
邻居\u n
不是一个单元格。如果您删除对
cell2mat
的调用,然后使用常规矩阵索引,该怎么办?它在我的情况下不起作用(在for循环中)。它返回我:???来自非单元格数组对象的单元格内容引用。43 cellclass=class(c{1})处的==>cell2mat错误;在114 idx=find(cell2mat(neighbor_n{i})==k)处的==>broadcastelimination中出错;N=努梅尔(N);对于k=1:N对于i=1:N如果(ismember(k,stated_N{i}));idx=find(cell2mat(stated_n{i})==k);陈述的{i}(idx)=[];如何做到这一点benoit 你试过我发布的代码了吗?您有两个for循环和一个循环,循环增量为
k
,这与上面使用的
k
相冲突。您不需要将
ismember…
与我使用的
find
函数一起使用。请看我上面的评论
Neighbor\u n
不是一个小小的吹毛求疵:实际上不需要检查空白;如果索引变量为空,则它是一个自动no-op.mh,因此
邻居\u n
不是一个单元格。如果您删除对
cell2mat
的调用,然后使用常规矩阵索引,该怎么办?它在我的情况下不起作用(在for循环中)。它返回我:???来自非单元格数组对象的单元格内容引用。43 cellclass=class(c{1})处的==>cell2mat错误;在114 idx=find(cell2mat(neighbor_n{i})==k)处的==>broadcastelimination中出错;N=努梅尔(N);对于k=1:N对于i=1:N如果(ismember(k,stated_N{i}));idx=find(cell2mat(stated_n{i})==k);陈述的{i}(idx)=[];如何做到这一点benoit 你试过我发布的代码了吗?您有两个for循环和一个循环,循环增量为
k
,这与上面使用的
k
相冲突。您不需要将
ismember…
与我使用的
find
函数一起使用。请看我上面的评论
Neighbor\u n
不是一个小小的吹毛求疵:实际上不需要检查空白;如果索引变量为空,则它是一个自动no-op.mh,因此
邻居\u n
不是一个单元格。如果您删除对
cell2mat
的调用,然后使用常规矩阵索引,该怎么办?它在我的情况下不起作用(在for循环中)。它返回我:???来自非单元格数组对象的单元格内容引用。43 cellclass=class(c{1})处的==>cell2mat错误;在114 idx=find(cell2mat(neighbor_n{i})==k)处的==>broadcastelimination中出错;N=努梅尔(N);对于k=1:N对于i=1:N如果(ismember(k,stated_N{i}));idx=查找(单元格2)地址{