删除空元胞数组
Deleting Empty cell arrays
我已经创建了元胞数组并使用循环放置了值。这是我所做的:
mycell =cell(1,100,num); %% assume num anything
idx = 1;
[a,b] = size(depth);
for i=1:a
for j=1:b
if isfinite(depth(i,j))
for segId=1:2
mycell{:,idx,segId} = depth(i,j);
idx=idx+1;
最后我得到了这样的结果:
mycell(;,:,1) =
[1] [1.2] [1.222] [] [] [] [0.7] [06] [] [0.34] .....[100n]
mycell(;,:,2) =
[] [] [] [1.33] [0.5] [0.3] [] [] [0.5] [] .....[100n]
有什么方法可以删除这些单元格数组中的空单元格...
或者有什么方法可以得到这样的输出:-
[1*9 值][1*88 值] 等等......就像在单元格数组上并在一个单元格中获取值......由于这个循环我无法这样做。
删除空单元格很简单(类似于)。本质上,这会在每个单元格元素上调用 isempty
,然后使用此逻辑数组索引到 mycell
并仅检索非空值。
newcell = mycell(cellfun(@isempty, mycell));
但是,您提到将多个元素合并为一个元素。您可以使用 {:}
扩展来做到这一点。这实际上是将您已索引的所有元素扩展到单独的输入中。因此,如果我们将这些作为 cat
的输入,我们就可以沿着指定的维度连接所有元素。
只是为了演示:
a = {1, 2, 3};
cat(2, a{:});
[1 2 3]
因此,在您的数据中,我们可以很容易地沿着三维的第一个索引合并所有数据:
item = cat(2, mycell{:,:,1});
我们也可以这样做以沿三维完全展平您的数据。
newcell = arrayfun(@(x)cat(2, mycell{:,:,x}), 1:size(mycell, 3), 'uni', 0);
如果您采用第二种方法,您甚至不必担心首先删除空单元格,因为它们会在串联过程中消失。
a = {1, 2, 3, [], 4};
cat(2, a{:});
[1 2 3 4]
我已经创建了元胞数组并使用循环放置了值。这是我所做的:
mycell =cell(1,100,num); %% assume num anything
idx = 1;
[a,b] = size(depth);
for i=1:a
for j=1:b
if isfinite(depth(i,j))
for segId=1:2
mycell{:,idx,segId} = depth(i,j);
idx=idx+1;
最后我得到了这样的结果:
mycell(;,:,1) =
[1] [1.2] [1.222] [] [] [] [0.7] [06] [] [0.34] .....[100n]
mycell(;,:,2) =
[] [] [] [1.33] [0.5] [0.3] [] [] [0.5] [] .....[100n]
有什么方法可以删除这些单元格数组中的空单元格...
或者有什么方法可以得到这样的输出:- [1*9 值][1*88 值] 等等......就像在单元格数组上并在一个单元格中获取值......由于这个循环我无法这样做。
删除空单元格很简单(类似于isempty
,然后使用此逻辑数组索引到 mycell
并仅检索非空值。
newcell = mycell(cellfun(@isempty, mycell));
但是,您提到将多个元素合并为一个元素。您可以使用 {:}
扩展来做到这一点。这实际上是将您已索引的所有元素扩展到单独的输入中。因此,如果我们将这些作为 cat
的输入,我们就可以沿着指定的维度连接所有元素。
只是为了演示:
a = {1, 2, 3};
cat(2, a{:});
[1 2 3]
因此,在您的数据中,我们可以很容易地沿着三维的第一个索引合并所有数据:
item = cat(2, mycell{:,:,1});
我们也可以这样做以沿三维完全展平您的数据。
newcell = arrayfun(@(x)cat(2, mycell{:,:,x}), 1:size(mycell, 3), 'uni', 0);
如果您采用第二种方法,您甚至不必担心首先删除空单元格,因为它们会在串联过程中消失。
a = {1, 2, 3, [], 4};
cat(2, a{:});
[1 2 3 4]