在许多其他语言中,将多个列表压缩在一起意味着采取类似
的方式((x1, x2, x3, x4), (y1, y2, y3, y3))
并将其转换为
((x1, y1), (x2, y2), (x3, y3), (x4, y4))
这当然是列表
我发现自己做了很多,所以我想我会分享解决方案。
答案 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)
如果所有单元格具有相同的长度,则会有一个没有cellfun
,arrayfun
或循环的简单解决方案。它基于mat2cell
(尽管名称)可以应用于单元格阵列的事实:
function out = zipCells(varargin)
n = numel(varargin{1});
out = mat2cell(reshape([varargin{:}], n, []), ones(1, n)).';
在一般情况下:将细胞修剪为最小长度(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)).';
允许具有不同方向的输入单元(行/列)的扩展名:
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]
希望这有帮助。