【问题标题】:Cell2mat for unequal lengths - MATLAB长度不等的 Cell2mat - MATLAB
【发布时间】:2014-10-15 09:56:54
【问题描述】:

我有一个简单的二维元胞数组,其中包含以下形式的数据:

当每列的长度不等时,使用 cat/cell2mat 的最简单方法是什么?有没有办法用 0 替换 [] 条目?

编辑

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

42
58
81
19
84
16
40
60
40
36

以此类推,而第二列的行将包含:

57
29
14
5
9
69
17
84
12
4

等等。

EDIT2

添加零看起来像这样:

【问题讨论】:

  • 你想得到什么结果?你想要 6 个矩阵(行),每个矩阵包含两列元素数量未知吗?为什么你需要它?因为现在您已经将所有数据很好地放在一起,您可以轻松地循环/寻址每个数据
  • 你能描述一下想要的输出吗?我猜这是一个数字数组,但大小是多少?
  • 并且每行单元格数组中的那些条目总是一维的吗? (我的意思是每个都是列向量?)
  • 一个矩阵不能有两列长度不等
  • @The Minion - 看我的编辑。我需要能够为单元格数组的每一列计算每个重复数字的实例。例如 - 100 在第一个元胞数组列中出现 3 次。我认为最好的办法是将其转换为矩阵,然后像平常一样使用histc

标签: matlab


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    此解决方案提出了一种几乎矢量化的方法来解决所述问题,并且还使其成为输入元胞数组中任意数量列的通用方法。这被归类为“几乎矢量化”,因为它使用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
    

    【讨论】:

      【解决方案3】:

      我建议你看看cellfun。如果不是'UniformOutput', false-part,我下面的解决方案会很好用。这只是必要的,因为我的示例中的某些单元格是空矩阵,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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        相关资源
        最近更新 更多