如何将多个单元阵列压缩在一起?

时间:2014-10-02 17:11:07

标签: matlab cell-array

在许多其他语言中,将多个列表压缩在一起意味着采取类似

的方式
((x1, x2, x3, x4), (y1, y2, y3, y3))

并将其转换为

((x1, y1), (x2, y2), (x3, y3), (x4, y4))

这当然是列表

  • 有超过2个子列表,
  • 其子列表长度不是4,
  • 其子列表可能有完全不同的长度。

我发现自己做了很多,所以我想我会分享解决方案。

3 个答案:

答案 0 :(得分:2)

这是我的实施:

function out = zipCells(varargin)
    % make sure all inputs are cell arrays
    assert(all(cellfun(@iscell, varargin)), 'Expecting cell arrays');

    % make them all of the same length
    mn = min(cellfun(@numel, varargin));
    in = cellfun(@(c) c(1:mn), varargin, 'UniformOutput',false);

    % zip lists
    out = cellfun(@(varargin) varargin, in{:}, 'UniformOutput',false);
end

(最后一行使用comma-separated lists扩展单元格数组的单元格数组in{:}

示例:

>> c = zipCells({'x','y','z'}, {1,2}, {'a','b','c'})
c = 
    {1x3 cell}    {1x3 cell}
>> c{:}
ans = 
    'x'    [1]    'a'
ans = 
    'y'    [2]    'b'

答案 1 :(得分:1)

  1. 如果所有单元格具有相同的长度,则会有一个没有cellfunarrayfun或循环的简单解决方案。它基于mat2cell(尽管名称)可以应用于单元格阵列的事实:

    function out = zipCells(varargin)
    n = numel(varargin{1});
    out = mat2cell(reshape([varargin{:}], n, []), ones(1, n)).';
    
  2. 一般情况下:将细胞修剪为最小长度(cellfun的两次使用)并按上述步骤操作:

    function out = zipCells(varargin)
    n = min(cellfun(@numel, varargin));
    varargin = cellfun(@(c) c(1:n), varargin, 'uniformoutput', 0);
    out = mat2cell(reshape([varargin{:}], n, []), ones(1, n)).';
    
  3. 允许具有不同方向的输入单元(行/列)的扩展名:

    function out = zipCells(varargin)
    n = min(cellfun(@numel, varargin));
    varargin = cellfun(@(c) reshape(c(1:n), 1,[]), varargin, 'uniformoutput', 0);
    out = mat2cell(reshape([varargin{:}], n, []), ones(1, n)).';
    

答案 2 :(得分:0)

你当然可以把所有东西放在一起,但名字应该有助于描述发生了什么:

function output = zipCells(varargin)

numComponents = min(cellfun(@length, varargin));
makeComponentI = @(i) cellfun(@(c) c{i}, varargin, 'UniformOutput', false);
output = arrayfun(makeComponentI, 1:numComponents, 'UniformOutput', false);

Herr的行动:

>> pairs = zipCells({'a' 'b' 'c' 'd'}, {1 2 3 4})
pairs = 
    {1x2 cell}    {1x2 cell}    {1x2 cell}    {1x2 cell}
>> pairs{:}
ans = 
    'a'    [1]
ans = 
    'b'    [2]
ans = 
    'c'    [3]
ans = 
    'd'    [4]

希望这有帮助。