如何实现循环以在向量中进行一组值的所有可能组合?

时间:2013-08-28 17:04:40

标签: matlab vector

我必须将一个向量传递给MATLAB中的一个函数。它有六个元素,每个元素可以有四个不同的值。我需要制作一个可以涵盖所有可能组合的循环。

基本上,矢量应采用以下值:

0.4 0.4 0.4 0.4 0.4 0.4

0.4 0.4 0.4 0.4 0.4 0.6

0.4 0.4 0.4 0.4 0.4 0.8

0.4 0.4 0.4 0.4 0.4 1.0

0.4 0.4 0.4 0.4 0.6 0.4

0.4 0.4 0.4 0.4 0.6 0.6

...

...

1   1   1   1   1   1

我认为这将是4 ^ 6 = 4096种组合。我必须为每个组合运行该功能。那我怎么能在这里做循环呢?我尝试了几个嵌套循环,我可以进行一个值更改并循环该值的位置,但这不会产生每个组合。请帮忙吗?

另一方面,将所有这些4096个向量顺序传递给函数会导致任何问题吗?像系统挂? (我使用i5,4 GB Ram)。

对于Matlab 7.9.0(R2009b)

3 个答案:

答案 0 :(得分:1)

好吧,如果你只需要写一个循环,一种方法是:

for i = [0.4 0.6 0.8 1];
    for j = [0.4 0.6 0.8 1];

    % work
    output = myfunction(whatever, args, i, j);

    end
end

在循环期间,i和j将获取该数组中的值(0.4,0.6,0.8,1)。如果您希望迭代器变量采用整数值,以便您可以将它们用作输出的索引,那么您可以执行类似的操作。

% out-of-loop variables
combo = [0.4 0.6 0.8 1]
output = zeros(length(combo)); % good coding practice to initialize variable outside of loop. 

for i = 1:length(combo);
    for j = 1:length(combo);

    % work
    output(i,j) = myfunction(whatever, args, combo(i), combo(j));

    end
end

不,运行5000长循环不会导致挂起。

答案 1 :(得分:0)

要生成此系列的index元素,请将索引转换为base-4数字。像这样:

values = 0.4:0.2:1;
index = 2314;
base4representation = dec2base(index, 4, 6);  %Returns the string "210022"
bese4representation_vector = double(base4representation-'0');  %Returns the vector [2 1 0 0 2 2]
result = values(bese4representation_vector+1);  %Returns [.8 .6 .4 .4 .8 .8]    

如果您愿意,可以将其放入循环中以生成所有4096个值(从0开始)。或者你可以随时生成它们。

答案 2 :(得分:-1)

您可以通过以下方式保存所有循环:

data=0.4:0.2:1;
DupData=kron(ones(1,6),data);
DesResult=unique(nchoosek(DupData,6),'rows');

这将按照你想要的顺序给你矢量,没有循环......