如何在matlab中选择和连接任意数量的字符串?

时间:2016-03-21 12:17:27

标签: matlab

函数output_cellstrings = choose_and_combine(varargin)可以接受任意数量的单元串输入。输入的数量和每个单元串数组的长度是任意的。

每次我们从每个单元格数组中选择一个元素并将它们连接起来,使字符串成为输出单元格字符串的元素。输出包含所有可能的组合。

如果我们有k个输入且其长度为n1n2,...,nk,则输出单元格字符串的长度为{{1 }}

结果应该是,

n1*n2*...*nk

2 个答案:

答案 0 :(得分:3)

看来你正在尝试创建那些字符串单元格数组的笛卡尔积,即以各种可能的方式组合它们,从每个输入中取一个字符串。

以下功能可以做到这一点。结果字符串的顺序与您的示例略有不同,但我认为这不是问题:

function out = choose_and_combine(varargin)
    indices = cellfun(@(x) 1:length(x), varargin, 'uni', false);
    [cartProdIdx{1:length(varargin)}] = ndgrid(indices{:});
    combinations = cellfun(@(strs,idx) reshape(strs(idx(:)),[],1), varargin, cartProdIdx, 'uni', false);
    out = strcat(combinations{:})';
end

>> choose_and_combine({'a1','a2'},{'b1'},{'c1','c2'})
ans = 
    'a1b1c1'    'a2b1c1'    'a1b1c2'    'a2b1c2'

>> choose_and_combine({'a1','a2'},{'b1'})
ans = 
    'a1b1'    'a2b1'

答案 1 :(得分:1)

仅供记录,另一种可能的解决方案(使用ind2sub):

function out = choose_and_combine(varargin)

[idx{1:nargin}] = ind2sub(cellfun(@numel, varargin), 1:prod(cellfun(@numel, varargin)));
out = cellfun(@(x) strjoin(arrayfun(@(i) varargin{i}{x(i)}, 1:numel(varargin), 'Un', 0), ''), num2cell(cell2mat(idx')', 2), 'Un', 0);