在matlab中实现向量中元素的排列组合

生成一个向量,比如Ai,i最大为10,其中有几项是固定为0的,比如第2,4,5项,其他项为1、2、3、4、5和0(2个)的排列组合,怎样把这个向量遍历出来

第1个回答  2014-12-18
其实挺简单。首先,忽略固定为0的几项,直接排列不固定的几项,比如如你所说的1、2、3、4、5、0、0:
x=[1,2,3,4,5,0,0];
y=perms(x);
y就是x的所有排列,perms是系统函数,你可以help一下。
但关键是有两个零,有些排列是重复的,此时使用化简函数unique即可:
y=unique(y,'rows');
y变成了一个排列的矩阵,每一行是一种排列,而且不重复。
最后在需要的位置插入一些0的列向量即可。追问

大神多谢你~~我还得问下你,如果数组长度是50,前几个还是12345,其余是0,这个时候超出了perms的范围怎么办呢,还有怎么在原矩阵里插入0向量呢,使用循环吗,有没有简单方法呢
大神辛苦你啦,我把分加到100吧

追答

插入零向量有一个好办法,比如你2,、4、5要插入零向量,排列矩阵为y,假设y为100行7列,则你先生成一个k=zeros(100,10)

然后k(:,[1,3,6:10])=y;
则k就直接插好了。
其实就是把排列y插到k对应的列上去就行了。

追问

大神你这方法太好了,不过之前的排列问题怎么办呢,我现在的这个算法可能要求数组长度得50——100,有没有办法用一个程序把排列逐一地列出来,然后算一下不符合条件就删掉。。。。要不把排列组合全列出来再算估计内存就放不下了

追答

如果内存不够,只能牺牲时间换空间了。使用穷举算法,风格类似于c语言,我说一下思路:

从数组的第一个元素开始填写:

    先填入当前可以填写的最小数

    数组是否到了末尾,即生成了一个排列?

    不是,则进入数组的下一个元素,跳回1;是,则检验排列,然后返回上一个元素,进入4;

    填一个比当前元素的值大的值,如果没有,继续向前跳一位,仍然进行4;如果有,向后跳一位,跳回1。

    当最后跳回至第一个元素的前方时,表明没有可以填的了,结束。

    这只是一个大概描述,你可以去找一个c语言穷举算法的例子实际体会一下。不结合程序,估计算法你很难理解。

追问

太谢谢您了,请您看下私信,我私信您了

本回答被提问者和网友采纳
相似回答