在 Matlab 中,如何从元胞数组中消除空列?
In Matlab, How to eliminate empty columns from the cell array?
所以在 3 X 18 元胞数组中,7 列是空的,我需要一个新的 3 X 11 元胞数组。有没有不循环的建议?
让我们考虑以下元胞数组。它的第二列仅包含 []
,因此应将其删除。
>> 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
大小相同的矩阵。当且仅当 c{m,n}
为空时,它在条目 (m,n)
处包含 1
。
~cellfun('isempty' ,c)
是上面的逻辑非,所以它包含1
,其中c
不为空。
any(~cellfun('isempty' ,c), 1)
将 any
应用于上面的每一列。因此,它是一个行向量,如果该列中 c
的任何单元格非空,则其第 m
个条目等于 1
,否则 0
。
- 以上用作 select
c
所需列的逻辑索引。
使用 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]
所以在 3 X 18 元胞数组中,7 列是空的,我需要一个新的 3 X 11 元胞数组。有没有不循环的建议?
让我们考虑以下元胞数组。它的第二列仅包含 []
,因此应将其删除。
>> 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
大小相同的矩阵。当且仅当c{m,n}
为空时,它在条目(m,n)
处包含1
。~cellfun('isempty' ,c)
是上面的逻辑非,所以它包含1
,其中c
不为空。any(~cellfun('isempty' ,c), 1)
将any
应用于上面的每一列。因此,它是一个行向量,如果该列中c
的任何单元格非空,则其第m
个条目等于1
,否则0
。- 以上用作 select
c
所需列的逻辑索引。
使用 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]