将作为单元阵列存储的不同大小的列向量累积到用NaN填充的矩阵中

时间:2014-07-31 11:31:09

标签: arrays matlab

想象一下,我在数组中有一系列不同大小的列向量,并希望通过用NaN填充空格来将它们分组到矩阵中。我怎么能这样做?

对于一个非常类似的问题(accumulate cells of different lengths into a matrix in MATLAB?)已有答案,但该解决方案处理行向量,我的问题是列向量。一种可能的解决方案可以是转置每个阵列组件,然后应用上述解决方案。但是,我不知道该怎么做。

此外,速度是一个问题,所以如果可能的话考虑到这一点。

2 个答案:

答案 0 :(得分:3)

您可以稍微调整that answer you found以适用于列:

tcell = {[1,2,3]', [1,2,3,4,5]', [1,2,3,4,5,6]', [1]', []'};                      %\\ ignore this comment, it's just for formatting in SO
maxSize = max(cellfun(@numel,tcell));    
fcn = @(x) [x; nan(maxSize-numel(x),1)]; 
cmat = cellfun(fcn,tcell,'UniformOutput',false);  
cmat = horzcat(cmat{:}) 

cmat =

     1     1     1     1   NaN
     2     2     2   NaN   NaN
     3     3     3   NaN   NaN
   NaN     4     4   NaN   NaN
   NaN     5     5   NaN   NaN
   NaN   NaN     6   NaN   NaN

或者您可以调整this作为替代方案:

cell2mat(cellfun(@(x)cat(1,x,NaN(maxSize-length(x),1)),tcell,'UniformOutput',false))

答案 1 :(得分:2)

如果你想要速度,cell数据结构就是你的敌人。对于这个例子,我假设你将这些向量存储在一个名为vector_holder的结构中:

elements = fieldnames(vector_holder);

% Per Dan request
maximum_size = max(structfun(@max, vector_holder));

% maximum_size is the maximum length of all your separate arrays
matrix = NaN(length(elements), maximum_size);

for i = 1:length(elements)
    current_length = length(vector.holder(element{i}));
    matrix(i, 1:current_length) = vector.holder(element{i});
end

处理cell变量时,许多Matlab函数都较慢。此外,具有cell双精度元素的N矩阵比具有N元素的双精度矩阵需要更多内存。