Matlab 假设有三个数值 【15,16,17】,现要写出三个数的全部排列,排列的数量从1~5,即总共有3^1+3^2

问题描述:

Matlab
假设有三个数值 【15,16,17】,现要写出三个数的全部排列,排列的数量从1~5,即总共有3^1+3^2+...+3^5=363排结果,如下:
15
16
17
15 15
15 16
15 17
...
17 17 17 17 16
17 17 17 17 17
每一排都是一个数组.
1个回答 分类:综合 2014-11-28

问题解答:

我来补答
v=[15 16 17]; %可选数据
N=5;          %最多个数

%以上是输入,下边是计算
M=length(v);  %M是可选个数
a=M.^(1:N);   %1到N位的排列数
num=sum(a);   %全部排列数
p=cell(num,1);%p是存放结果cell矩阵
ii=1;         %存放位置
for n=1:N
    for k=1:a(n)
        x=k-1;b=zeros(1,n);
        for j=1:n
            b(n-j+1)=mod(x,M)+1;
            x=floor(x/M);
        end
        p{ii}=v(b);
        ii=ii+1; %存放位置加1
    end
end
这程序输入在前两行v是一个向量,表示可以选择的数,可以不止3个N是最多排列个数,表示可以从v中选1,2,.N个进行排列
而由于取1个,取2个,...取N各排列的数组长度不一致这里用cell矩阵来存放结果结果存在p中,p是cell矩阵,每个单元都是一个数组
再问: 大神,补充个问题可以么?那个cell数组可以存多少个啊?如果v有20个可能的数剧,然后N也非常大,怎么解决?MATLAB提示放不下啊
再答: 数太多,就不用数组保存,每次产生一个组合就写到文件中

有M个,最多排N个
数据随M,N增长很快
M=20,N=5,就有三百多万众组合

太大的M和N,一个文件都未必能放下
再问: 把p=cell(num,1)换成存文件是么
再问: 大神能教一下怎么写入么?在你之前的程序基础上
再答: v=[15 16 17]; %可选数据
N=5; %最多个数

%以上是输入,下边是计算
M=length(v); %M是可选个数
a=M.^(1:N); %1到N位的排列数
num=sum(a); %全部排列数

fid=fopen('文件名','w');
for n=1:N
for k=1:a(n)
x=k-1;b=zeros(1,n);
for j=1:n
b(n-j+1)=mod(x,M)+1;
x=floor(x/M);
end
fprintf(fid,'%d\t',v(b));
fprintf(fid,'\n');

end
end
fclose(fid);
再问: mn太大的时间还是存不了 不过还是谢谢你了 (^_^)
再问: 大神 补个简单的问题吧 两个数 1.2, 产生长度为4的全排列, 从1 1 1 1到2 2 2 2,怎么弄
 
 
展开全文阅读
剩余:2000
上一页:画钩的
下一页:速率