空单元格对单元格列进行排序,而不重新整形单元格

时间:2016-06-07 16:34:10

标签: arrays matlab sorting cell

我有一个由不同值和不同数量的元素和许多空单元组成的单元组成的单元阵列。我想重新排序每列单元格,以便将空单元格推送到最后一行但不重新排序非空单元格。

(道歉可能没有以最好的方式写出来) 所以细胞:

<a href="http://linklocation.com" target="_blank"><img src="http://imagelocation.com" border="0"></a> 
<a href="http://linklocation2.com" target="_blank"><img src="http://imagelocation2.com" border="0" width="200px" height="20px"></a> 

需要这个:

[1,2,3] []      [1,4,2] []      []
[]      [1,2,5] []      []      [2,2,1]
[3,7,1] []      [1,1,1] [2,3,1] [1,2,2]

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:4)

您可以使用cellfun遍历所有元素并确定单元格是否为空,然后可以沿第一维对结果(逻辑矩阵)进行排序。这会将所有空元素(1)推送到最后一行,并将非空元素(0)保留在顶部,并且不会改变它们的顺序,因为它们都具有相同的值(1)。

data = {[1,2,3], [], [1,4,2],  [], [];
        [], [1,2,5], [], [], [2,2,1];
        [3,7,1], [], [1,1,1], [2,3,1], [1,2,2]};

% Create a logical matrix that is 1 where the empty elements are and sort the columns
[~, rows] = sort(cellfun(@isempty, data), 1);

% Convert to linear index and index into the original matrix to re-arrange
newdata = data(bsxfun(@plus, rows , size(data, 1)*(0:size(data, 2)-1)));

%   [1x3 double]    [1x3 double]    [1x3 double]    [1x3 double]    [1x3 double]
%   [1x3 double]              []    [1x3 double]              []    [1x3 double]
%             []              []              []              []              []