我有一个简单的问题,但我无法弄清楚或在任何地方找到它。 我有一个单元格数组,其中c {1}是一个向量,c {2}是一个向量但长度不同的向量,直到c {i}。我想要的是一个向量是[c {1}; c {2}; c {3} ... c {i}]。最有效的方法是什么?
答案 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中;没有循环:
如果单元格数组包含列向量,并且您希望将它们排列成一个大列向量:
result = vertcat(c{:}); %// vertically concat all vectors
示例:
>> c = {[1;2], [1;2;3]};
>> result = vertcat(c{:})
result =
1
2
1
2
3
如果单元格数组包含行向量,则可以将它们排列为矩阵的行,使用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