这是我想要做的:
我有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真的有帮助。
答案 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{:}];
等转换为数字向量。
您可以按以下步骤操作:
s
构建一个单元格数组,使每个单元格包含整个输入向量或其特定值。使用for
循环或使用arrayfun
代码:
%// 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);