值的动态组合

时间:2015-06-16 21:02:48

标签: arrays matlab

这是我想要做的:

我有4个输入x1,x2,x3,x4

它们各自都有一系列可能的值,f.e

x1={1,2}

x2=x3=x4={1,2,3}

这些值x1,x2,x3,x4可能是已知的,但它们也可能是未知的(输入= 0)。我想生成一个包含所有可能组合的矩阵。

所以例如: 输入(0,0,2,3)表示x1和x2未知,x3和x4已知。由于x1有2种可能性,而x2有3种可能性,我需要2 * 3 = 6种组合,其中x3和x4是固定的:

1 1 2 3
1 2 2 3
1 3 2 3
2 1 2 3
2 2 2 3
2 3 2 3

我如何实现这一目标?通常情况下,我会做几个嵌套for循环,但那是最好的工作,因为我不知道哪些变量是已知的,哪些变量不是。另一方面,perm()doenst真的有帮助。

3 个答案:

答案 0 :(得分:0)

您可以为[x1 x2 x3 x4]预先生成所有可能的值组合,并将其存储在变量中,例如{{1 }}

从那里开始:

comb

答案 1 :(得分:0)

试试这个(这应该是通用的):

% This is your input
ranges = {[1, 2], [1, 2, 3], [1, 2, 3], [1, 2, 3]};
input_v = [0, 0, 2, 3];

% initialise a cell to hold vectors to be combined
combine_us = cell(size(ranges));

for ii = 1:length(input_v)
    % this tests for 0. If your arrays can contain 0, use NaN instead
    if input_v(ii) == 0
        combine_us{ii} = ranges{ii};
    else
        combine_us{ii} = input_v(ii);
    end
end
% calculate the numbers of combinations added with every input
n_combinations = [1 cumprod(cellfun(@numel, combine_us))];
% initialize output matrix
out_v = zeros(n_combinations(end), length(input_v));
% set the output values, cycling so that each combination will be obtained
for ii = 1:length(input_v)
    for jj = 1:n_combinations(end)
        out_v(jj, ii) = combine_us{ii}(mod(ceil(jj / n_combinations(ii)) - 1, length(combine_us{ii} )) + 1);
    end
end

答案 2 :(得分:0)

我假设您的输入是数字向量,而不是数字的单元格数组。如果它们确实是数字的单元格数组,则可以使用x1 = [x1{:}];等转换为数字向量。

您可以按以下步骤操作:

  1. 根据s构建一个单元格数组,使每个单元格包含整个输入向量或其特定值。使用for循环或使用arrayfun
  2. 即可轻松完成此操作
  3. 应用these answers之一生成所有组合。
  4. 代码:

    %// Inputs
    x1 = [1,2];
    x2 = [1,2,3];
    x3 = [1,2,3];
    x4 = [1,2,3];
    s = [0 0 2 3];
    
    %// Step 1
    x = {x1 x2 x3 x4};
    ind = s~=0;
    x(ind) = arrayfun(@(y,t) {y{1}(t)}, x(ind), s(ind));
    
    %// Step 2
    n = numel(x);
    combs = cell(1,n);
    [combs{end:-1:1}] = ndgrid(x{end:-1:1});
    combs = cat(n+1, combs{:});
    combs = reshape(combs,[],n);