我有一个单元格数组,如下所示:
a = {[1 2 3] [5 3 6] [9 1 3]};
现在我要从a
中包含1
的每个数组中删除1,以便输出如图所示
a = {[2 3] [5 3 6] [9 3]};
我知道单元格数组中数组的索引' a'它包含1.这可以使用for
循环和一个临时变量来完成,但这需要花费很多时间(我想对像1x100000这样大小的单元格数组执行操作。上面的那个只是例如)
我想知道是否有任何可以快速完成此操作的直接方法。
答案 0 :(得分:3)
对于那么大的单元阵列来说,几乎任何东西都会变慢。您可以尝试使用cellfun
执行此操作,但不一定能保证比for循环更快。
a = cellfun(@(x)x(x ~= 1), a, 'UniformOutput', false);
% a{1} =
% 2 3
% a{2} =
% 5 3 6
% a{3} =
% 9 3
答案 1 :(得分:1)
正如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
答案 2 :(得分:-1)
此示例显示如何从单个单元格中删除数据,以及如何从单元格数组中删除整个单元格。要运行此示例中的代码,请创建一个3乘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]`