MATLAB / OCTAVE从单元阵列中的不同大小的向量中提取元素

时间:2014-01-02 20:24:57

标签: matlab octave cell-array

我有一个简单的问题,但我无法弄清楚或在任何地方找到它。 我有一个单元格数组,其中c {1}是一个向量,c {2}是一个向量但长度不同的向量,直到c {i}。我想要的是一个向量是[c {1}; c {2}; c {3} ... c {i}]。最有效的方法是什么?

5 个答案:

答案 0 :(得分:3)

以下单行甚至适用于完全不一致的输入:

result = [cell2mat(cellfun(@(x) x(:), A, 'uni', 0)')]'

示例:

有:

A{1} = [1, 2, 3, 4, 5];
A{2} = [6; 7; 8; 9];
A{3} = [10, 12; 11, 13];

它返回:

result =

     1     2     3     4     5     6     7     8     9    10    11    12    13

答案 1 :(得分:2)

Matlab / Octave允许这个真正无效但非常方便的符号之王,假设a是一个只包含列向量的结构:

x = [];             #% A fresh new vector/matrix/tensor, who knows?
for i=1:numel(a)    #% parse container item by item
   x = [x;a{i}];    #% append container item a{i} to x in a column-fashion way
end

这样可行,但由于它会重新分配x每个for步骤并且它不是防弹的(没有错误处理,没有类型检查),因此效率极低:因此如果它遇到任何问题它将会失败(矩阵,字符串,行向量)但可能在此类容器中找到的列向量。

无论如何,它将简化一个不那么严格和启发式的设计,但是当需要强大的设计时,请考虑重新实现。

答案 2 :(得分:0)

您可以用零填充每个单元格,并将长度与最长的单元格向量对齐。它通过迭代每个单元格向量在循环中完成。

答案 3 :(得分:0)

这取决于c中的向量是行向量还是向量向量。但通常最快和最紧凑的方式是:

c={[1 2 3], [4 5 6 7 8], [9 10]}
cell2mat(c)
cat(2, c{:})

c={[1 2 3]', [4 5 6 7 8]', [9 10]'}
% cell2mat(c) % Doesn't work.
cat(1, c{:})

个人而言,我更喜欢猫。

答案 4 :(得分:0)

在Matlab中;没有循环:

  1. 如果单元格数组包含向量,并且您希望将它们排列成一个大列向量:

    result = vertcat(c{:}); %// vertically concat all vectors
    

    示例:

    >> c = {[1;2], [1;2;3]};
    >> result = vertcat(c{:})
    result =
         1
         2
         1
         2
         3
    
  2. 如果单元格数组包含向量,则可以将它们排列为矩阵的行,使用NaN(或任何其他值)填充不存在的值:< / p>

    M = max(cellfun(@numel, c)); %// max length of vectors
    c2 = cellfun(@(row)[row NaN(1,M-numel(row))], c, 'uni', 0); %// fill with NaN
    result = vertcat(c2{:}); %// concat all equal-size row vectors into a matrix
    

    示例:

    >> c = {[1 2], [1 2 3]};
    >> M = max(cellfun(@numel, c));
    >> c2 = cellfun(@(row)[row NaN(1,M-numel(row))], c, 'uni', 0);
    >> result = vertcat(c2{:})
    result =
         1     2   NaN
         1     2     3