作业帮 > 综合 > 作业

matlab排列组合问题

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/18 01:00:09
matlab排列组合问题
我需要用MATLAB做一个排列组合问题,这个组合是这样的有n个数列
1=[11 12]
2=[21 22]
3=[31 32]
4=[41 42]
.
.
.
.
n=[n1 n2]
从这些数列中选取4个然后从选取的4个数列中任选一个列出所有的排列组合.
(最好是n可以是n=input('')形式的)
1、数据都是[n1 n2]这种形式?比如n=10,对应的就是[101 102]?
2、最后这句话【从这些数列中选取4个然后从选取的4个数列中任选一个列出所有的排列组合】不明确,详细说明一下.
再问: 1、的解释是对的 2、我的意思就是是从这些数列中选取4个数,但是这4个数都不能是从同一个数列中取出的 例如: [501 402 101 901]这样取数就是可以的; [702 901 801 701]&[702 901 801 701]&[101 101 102 102]这些取数的形式都是错误的。 这样明白了么
再答: 1、是不是可以理一个n*2的矩阵,每次取4个元素,这4个元素必需不同行,但对是否同列没要求?求出所有可能的排列或组合。 2、到底是要排列,还是要组合? 举例来说,如果n=5,任取4行,有5种可能,然后每行都有2个元素可用,这样又有2^4=16种组合,也就是说,共有5*16=80种组合。而如果是排列的话,还要再乘以4!=24,共有1920种排列。 我上面的理解正确吗?
再问: 理解正确,排列和组合都需要,谢谢!
再答: 参考代码% 生成数列,放在一个矩阵中
n = 5;
A = repmat(1:n,2,1)'*10 + repmat(1:2,n,1);

% 元素行号的可能组合
I = nchoosek(1:n, 4);
% 元素列号的可能组合
[a, b, c, d] = ndgrid(1:2);
J = [a(:) b(:) c(:) d(:)];
% 元素行与列的可能组合
[X,Y] = meshgrid(1:size(I,1),1:size(J,1));

% n选一的所有组合
C = cell2mat(arrayfun(@(col){arrayfun(@(i,j)A(i,j),I(X(:),col),J(Y(:),col))},1:4));

% 由组合生成所有可能的排列
N_ = factorial(4);
m = size(C,1);
P = zeros(m*N_,4);
for i = 1 : m
    P((i-1)*N_+(1:N_),:) = perms(C(i,:));
end

% 检验:C和P都只包含矩阵A里面的数据
isequal(unique(C),sort(A(:)))
isequal(unique(P),sort(A(:)))

% 检验:C和P都没有重复的行
size(unique(C,'rows'),1)==size(C,1)
size(unique(P,'rows'),1)==size(P,1) 说明我写的这段代码不太容易读懂,要想真正搞明白,需要熟悉匿名函数、arrayfun、ndgrid、meshgrid、repmat、nchoosek、cell2mat、factorial、perms、unique这些相关的函数。 我对自己的代码质量有信心。如果只是想要使用,放心就直接用,不放心的话请自行检验。 如果想要读懂代码,需要自己静下心慢慢体会,该写的注释我都已经写了。除非你认为存在错误,或者你有更好的实现方法,否则请不要随便问我哪句是什么意思——至少,把我上面说的那些东西都搞明白了再问(真搞明白了,也就不用问了)。