我有一个简单的2D单元格数组,其中包含以下形式的数据:
当每列的长度不等时,能够使用cat / cell2mat的最简单方法是什么?有没有办法用0?
替换[]条目修改:
期望的输出将是具有相同列数的矩阵。对于上面显示的示例,第一列中的行将包含:
42
58
81
19
84
16
40
60
40
36
等等,而第二列的行包含:
57
29
14
5
9
69
17
84
12
4
等等。
EDIT2 :
添加零看起来像这样:
答案 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)