我有一个如下所示的单元数组:
a = {[1 2 3] [5 3 6] [9 1 3]};
现在我想要从
a
中每个包含1
的数组中删除1,使输出结果如下。a = {[2 3] [5 3 6] [9 3]};
我知道包含1的单元格数组'a'中数组的索引。这可以使用
for
循环和临时变量来完成,但这需要很长时间(我想在大小为1x100000的单元格数组上执行操作。上面的示例仅供参考)。我想知道是否有任何直接的方法可以快速完成此操作。
我有一个如下所示的单元数组:
a = {[1 2 3] [5 3 6] [9 1 3]};
a
中每个包含1
的数组中删除1,使输出结果如下。a = {[2 3] [5 3 6] [9 3]};
for
循环和临时变量来完成,但这需要很长时间(我想在大小为1x100000的单元格数组上执行操作。上面的示例仅供参考)。如果使用这么大的单元数组,几乎任何操作都会很慢。您可以尝试使用cellfun
,但它并不能保证比for循环更快。
a = cellfun(@(x)x(x ~= 1), a, 'UniformOutput', false);
% a{1} =
% 2 3
% a{2} =
% 5 3 6
% a{3} =
% 9 3
正如Suever所评论的那样,因为您正在使用单元数组并且它是一个动态容器,所以如果您想修改内容,您别无选择,只能遍历每个单元。 为了自给自足,这里是使用for
循环的方法:
for ii = 1 : numel(a)
a{ii} = a{ii}(a{ii} ~= 1);
end
cellfun
的开销。上面的代码访问每个单元格中的向量,并提取出那些不等于1的值,并用这个新向量覆盖相应的单元格。a = {[1 2 3] [5 3 6] [9 1 3]};
>> format compact; celldisp(a)
a{1} =
2 3
a{2} =
5 3 6
a{3} =
9 3
C = {1, 2, 3; 4, 5, 6; 7, 8, 9};
通过将空数组分配给单元格并使用花括号进行内容索引,{},可以删除特定单元格的内容:
C{2,2} = []
这段代码返回
C =
[1] [2] [3]
[4] [] [6]
[7] [8] [9]
C(2,:) = []
删除 C 的第二行:
`
C =
[1] [2] [3]
[7] [8] [9]`