不等长度的Cell2mat - MATLAB

时间:2014-10-15 09:56:55

标签: matlab

我有一个简单的2D单元格数组,其中包含以下形式的数据:

enter image description here

当每列的长度不等时,能够使用cat / cell2mat的最简单方法是什么?有没有办法用0?

替换[]条目

修改

期望的输出将是具有相同列数的矩阵。对于上面显示的示例,第一列中的行将包含:

42
58
81
19
84
16
40
60
40
36

等等,而第二列的行包含:

57
29
14
5
9
69
17
84
12
4

等等。

EDIT2

添加零看起来像这样:

enter image description here

3 个答案:

答案 0 :(得分:4)

也许这就是你想要的。最后添加了零。

c = {[1;2] [10; 20; 30]; [3;4;5] [40]; [6; 7] []}; %// example
c1 = vertcat(c{:,1});
c2 = vertcat(c{:,2});
n1 = numel(c1);
n2 = numel(c2);
result = zeros(max(n1,n2),2);
result(1:n1,1) = c1;
result(1:n2,2) = c2;

在这个例子中:

>> celldisp(c)
c{1,1} =
     1
     2
c{2,1} =
     3
     4
     5
c{3,1} =
     6
     7
c{1,2} =
    10
    20
    30
c{2,2} =
    40
c{3,2} =
     []
>> result
result =
     1    10
     2    20
     3    30
     4    40
     5     0
     6     0
     7     0

答案 1 :(得分:1)

该解决方案提出了一种几乎矢量化的方法来解决所述问题,并使其成为输入单元阵列中任意数量列的通用方法。这被归类为“几乎矢量化”,因为它使用cellfun('length'..)(如果查看代码),AFAIK cellfun基本上是for循环的包装器。但在这种情况下,cellfun('length'..)非常轻量级,其余的代码都是矢量化的,这就是术语“几乎矢量化”的原因。

代码 -

%// 3 column sized input cell array
c = {[1;2] [10; 20; 30] [3;8;42]; [3;4;5] [40] [3]; [6; 7] [] [5;9;11;32]} 

lens = sum(cellfun('length',c),1)
out = zeros(max(lens),numel(lens))
out(bsxfun(@le,[1:max(lens)]',lens)) = vertcat(c{:})

输出 -

>> c
c = 
    [2x1 double]    [3x1 double]    [3x1 double]
    [3x1 double]    [        40]    [         3]
    [2x1 double]              []    [4x1 double]
>> out
out =
     1    10     3
     2    20     8
     3    30    42
     4    40     3
     5     0     5
     6     0     9
     7     0    11
     0     0    32

答案 2 :(得分:0)

我建议你看看cellfun。我的解决方案可以很好地工作,如果不是'UniformOutput', false - 部分。这只是必要的,因为我的示例中的某些单元格是空矩阵,histc的行为不同。

cellarray = cell(3,2);
cellarray(:,1)= {[3, 2, 1]; [12, 3, 4, 6]; []};

edges = 1:13; % If you do not know the range of values, find them using cellfun(min, cellarray), and max
x = cellfun(@(x)histc(x, edges), cellarray, 'UniformOutput', false)