将各种大小的单元阵列的Wrangle单元阵列放入大小为{1xN}的单元阵列的单元阵列中

时间:2015-04-19 00:59:13

标签: arrays matlab cell-array

我正在尝试使用combnk来生成单元格中所有字符串的组合。 E.g:

someStrings = {'a','b','dog','goat'};
results = arrayfun(@(k) combnk(someStrings,k),1:length(someStrings),'UniformOutput',0);

这为我提供了一个4*1单元格数组,其中包含以下维度:

{4x1 cell}    {6x2 cell}    {4x3 cell}    {1x4 cell}

我想要的是15*1单元格数组的单元格数组,每个单元格的大小为{1xN};即4个大小为{1,1}的小区阵列,6个大小为{1,2}的小区,等等。我该如何有效地做到这一点?

编辑:好的,现在我在这里:

results = transpose(arrayfun(@(k) num2cell(combnk(someStrings,k),2),1:length(someStrings),'UniformOutput',0));
finalResults = vertcat(results{:});

是否可以将其转换为一行?如何索引像“{:}”这样的单元格数组,但是在行中创建了单元格数组?

2 个答案:

答案 0 :(得分:1)

您可以按如下方式实现:

intermResults=cellfun(@(x) num2cell(x,2),results,'uni',0);
finalResults=vertcat(intermResults{:});

解释:如果你查看你的results变量,你就有了这15个单元格。您只需要提取每一行并使其成为一个单元格。这就是num2cell(x,2)的作用。通过将其包装到cellfun中,我将其应用于单元格数组results中的每个单元格。现在,您有一个1x4单元格,其中每行结果都已转换为单独的单元格。你只需要将它连接起来就可以产生最终的答案。这是vertcat(intermResults{:})的作用。

答案 1 :(得分:1)

你可以这样做:

m = dec2bin(1:2^numel(someStrings)-1)-'0'; %// each row contains indices of a combination
[~, s] = sort(sum(m,2)); %// compute sum of each row, sort and get sorting indices
m = m(s,:); %// sort rows according to sum
[jj, ii] = find(m.'); %'// find column indices (jj), ordered by row (ii)
result = accumarray(ii, jj, [], @(x){someStrings(x)}); %// group col indices of each row

这为您的示例someStrings提供了

>> result
result = 
    {1x1 cell}
    {1x1 cell}
    {1x1 cell}
    {1x1 cell}
    {1x2 cell}
    {1x2 cell}
    {1x2 cell}
    {1x2 cell}
    {1x2 cell}
    {1x2 cell}
    {1x3 cell}
    {1x3 cell}
    {1x3 cell}
    {1x3 cell}
    {1x4 cell}

,其中

>> result{1}
ans = 
    'goat'
>> result{2}
ans = 
    'dog'
>> result{3}
ans = 
    'b'
>> result{4}
ans = 
    'a'
>> result{5}
ans = 
    'dog'    'goat'
>> result{6}
ans = 
    'b'    'goat'
[...]
>> result{15}
ans = 
    'a'    'b'    'dog'    'goat'