我正在尝试使用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{:});
是否可以将其转换为一行?如何索引像“{:}”这样的单元格数组,但是在行中创建了单元格数组?
答案 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'