因此,在3 X 18单元阵列中,7列是空的,我需要一个3 X 11的新单元阵列。任何建议都不需要循环?
答案 0 :(得分:3)
让我们考虑以下单元格数组。其第二列仅包含[]
,因此应将其删除。
>> c = {1 , [], 'a'; 2, [], []; 3, [], 'bc'}
c =
[1] [] 'a'
[2] [] []
[3] [] 'bc'
您可以计算逻辑索引以告知应保留哪些列,然后使用它来获取结果:
>> keep = any(~cellfun('isempty',c), 1); %// keep columns that don't only contain []
keep =
1 0 1 %// column 2 should be removed
>> result = c(:,keep)
result =
[1] 'a'
[2] []
[3] 'bc'
工作原理:
cellfun('isempty' ,c)
是一个与c
大小相同的矩阵。当且仅当1
为空时,它在条目(m,n)
处包含c{m,n}
。~cellfun('isempty' ,c)
是对上述内容的逻辑否定,因此它包含1
,其中c
不为空。any(~cellfun('isempty' ,c), 1)
将any
应用于上述各列。因此,如果该列中m
的任何单元格非空,则其1
- 条目等于c
,这是一个行向量,否则为0
。 / LI>
c
答案 1 :(得分:1)
使用cellfun
检测元素,然后从中找到包含空元素的列并删除它们:
cellarray(:, any(cellfun(@isempty, cellarray), 1)) = [];
如果您希望保留至少包含一个非空元素的列,请使用all
代替any
。
例如:
>> cellarray = {1 2 ,[], 4;[], 5, [], 3}
[1] [2] [] [4]
[] [5] [] [3]
>> cellarray(:,any(cellfun(@isempty, cellarray), 1))=[]
cellarray =
[2] [4]
[5] [3]