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

如何在matlab中选择和连接任意数量的字符串?,matlab,Matlab,函数output\u cellstrings=choose\u and\u combine(varargin)可以接受任意数量的单元格字符串输入。输入的数量和每个单元格字符串数组的长度是任意的 每次我们从每个单元格数组中选择一个元素,并将它们连接起来,生成一个字符串作为输出单元格字符串的元素。输出包括所有可能的组合 如果我们有k输入,且其长度为n1,n2,…,nk,则输出单元格字符串的长度将为n1*n2*…*nk 结果应该是, >> choose_and_combine({'a1',

函数
output\u cellstrings=choose\u and\u combine(varargin)
可以接受任意数量的单元格字符串输入。输入的数量和每个单元格字符串数组的长度是任意的

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

如果我们有
k
输入,且其长度为
n1
n2
,…,
nk
,则输出单元格字符串的长度将为
n1*n2*…*nk

结果应该是,

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

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

>> choose_and_combine({'a1','a2'},{'b1','b2','b3'},{'c1','c2'})
'a1b1c1'    'a1b1c2'    'a1b2c1'    'a1b2c2'    'a1b3c1'    'a1b3c2'    'a2b1c1'    'a2b1c2'    'a2b2c1'    'a2b2c2'    'a2b3c1'    'a2b3c2'

似乎您正在尝试创建这些字符串单元格数组的笛卡尔积,即以所有可能的方式组合它们,从每个输入中提取一个字符串

下面的函数可以实现这一点。字符串的结果顺序与示例中略有不同,但我认为这不是问题:

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'

似乎您正在尝试创建这些字符串单元格数组的笛卡尔积,即以所有可能的方式组合它们,从每个输入中提取一个字符串

下面的函数可以实现这一点。字符串的结果顺序与示例中略有不同,但我认为这不是问题:

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'

为了记录在案,另一种可能的解决方案(使用):


为了记录在案,另一种可能的解决方案(使用):


我们需要更多的信息。你试着做什么?那么当你有{'a1'、'a2'、'a3'}、{'b1'、'b2'}和{'c1'、'c2'}时会发生什么呢?@GameOfThrows所有可能的组合。@Jørgen我认为第一篇文章中的简单例子已经足够清楚了。看来我过于乐观了。有些人知道,有些人不知道。即使有好的答案,问题怎么会因为不清楚而被搁置?我们需要更多的信息。你试着做什么?那么当你有{'a1'、'a2'、'a3'}、{'b1'、'b2'}和{'c1'、'c2'}时会发生什么呢?@GameOfThrows所有可能的组合。@Jørgen我认为第一篇文章中的简单例子已经足够清楚了。看来我过于乐观了。有些人知道,有些人不知道。即使有好的答案,一个问题怎么会因为不清楚而被搁置?为什么它被称为“笛卡尔产品”?维基百科:是的,看起来是一样的想法。感谢您提供的信息。同时也感谢动态varargout。我不知道那是怎么回事。为什么它叫笛卡尔积?维基百科:是的,看起来是一样的。感谢您提供的信息。同时也感谢动态varargout。我不知道那条路。