matlab求一组数字的组合数(不重复)

img


本人遇到的问题是用matlab对一组数字求组合数,要求不重复。
问题如下:把我的学号2020330361020拆成一个个元素,比如12拆成1和2。再进行3个数的组合,比如{0 0 2}。因为学号里的元素有重复,所以要求输出不重复的所有组合数的情况,求一个function子函数。
有没有人会,有酬。

demo:

clc,clear,close all;
 
stID = '2020330361020'; 
x1 = zeros(1,length(stID));
for i = 1:length(stID)  
    x1(i) = str2double(stID(i)); %元素分割
end
x2 = unique(x1);  %去重
restID(x2)
unique(restID(x1),'rows')

function y = restID(x) %全组合子函数
    y = nchoosek(x,3);  %实现组合的核心函数
end

示例1:

clc,clear,close all;
 
stID = '2020330361020'; 
x1 = zeros(1,length(stID));
for i = 1:length(stID)  
    x1(i) = str2double(stID(i)); %元素分割
end
disp("学号中的所有元素:")
x1
disp("去重后的元素:")
x2 = unique(x1)  %去重
disp("全组合(3个一组):")
restID(x2)

function y = restID(x) %全组合子函数
    y = nchoosek(x,3); %参数2表示几个一组合
end

结果1:

学号中的所有元素:

x1 =

     2     0     2     0     3     3     0     3     6     1     0     2     0

去重后的元素:

x2 =

     0     1     2     3     6

去重后的全组合:
ans =

     0     1     2
     0     1     3
     0     1     6
     0     2     3
     0     2     6
     0     3     6
     1     2     3
     1     2     6
     1     3     6
     2     3     6

示例2:

clc,clear,close all;
 
stID = '2020330361020'; 
x1 = zeros(1,length(stID));
for i = 1:length(stID)  
    x1(i) = str2double(stID(i)); %元素分割
end
disp("学号中的所有元素:")
x1
disp("去重后的元素:")
x2 = unique(x1)  %去重
disp("去重后的全组合(3个一组):")
restID(x2)
disp("去重前的全组合(并剔除重复):")
unique(restID(x1),'rows')  %由于去重前的学号里有重复元素,所以组合结果会有重复行,使用unique函数按行剔除重复组即可
function y = restID(x) %全组合子函数
    y = nchoosek(x,3); %参数2表示几个一组合,可自定义修改
end

结果2:

学号中的所有元素:

x1 =

     2     0     2     0     3     3     0     3     6     1     0     2     0

去重后的元素:

x2 =

     0     1     2     3     6

去重后的全组合(3个一组):

ans =

     0     1     2
     0     1     3
     0     1     6
     0     2     3
     0     2     6
     0     3     6
     1     2     3
     1     2     6
     1     3     6
     2     3     6

去重前的全组合(并剔除重复组合):

ans =

     0     0     0
     0     0     1
     0     0     2
     0     0     3
     0     0     6
     0     1     0
     0     1     2
     0     2     0
     0     2     1
     0     2     2
     0     2     3
     0     2     6
     0     3     0
     0     3     1
     0     3     2
     0     3     3
     0     3     6
     0     6     0
     0     6     1
     0     6     2
     1     0     0
     1     0     2
     1     2     0
     2     0     0
     2     0     1
     2     0     2
     2     0     3
     2     0     6
     2     1     0
     2     1     2
     2     2     0
     2     2     1
     2     2     2
     2     2     3
     2     2     6
     2     3     0
     2     3     1
     2     3     2
     2     3     3
     2     3     6
     2     6     0
     2     6     1
     2     6     2
     3     0     0
     3     0     1
     3     0     2
     3     0     3
     3     0     6
     3     1     0
     3     1     2
     3     2     0
     3     3     0
     3     3     1
     3     3     2
     3     3     3
     3     3     6
     3     6     0
     3     6     1
     3     6     2
     6     0     0
     6     0     2
     6     1     0
     6     1     2
     6     2     0

使用到的相关函数官方手册教程:
unique函数:https://ww2.mathworks.cn/help/matlab/ref/double.unique.html?s_tid=doc_ta#d124e1504952
nchoosek函数:https://ww2.mathworks.cn/help/matlab/ref/nchoosek.html?s_tid=doc_ta

已解决问题全部情况,望采纳,有问题请留言,看到就回,简单的修改可以自行尝试调试,感谢合作!


function result=zuoye(a)
a=num2str(a);
n=length(a);
s=0;
for i=1:n
    b=[a(1:i-1),a(i+1:n)];
    x1=a(i:i);
    for j=1:n-1
        c=[b(1:j-1),b(j+1:n-1)];
        x2=b(j:j);
        for k=1:n-2
            s=s+1;
            x(s)={[x1,x2,c(k:k)]};
        end
    end
end
x=unique(x)
end           
      

这种方法,是3位数任意排列,但没有重复(比如数字6,可以放在3前面,632,631……)

function result=zuoye(a)
a=num2str(a);
a=nchoosek(a,3);
n=length(a);
for i=1:n
    x(i)={a(i,:)};
end
x=unique(x)
end

这种方法,是按序挑出3个数,原来选号中,6在3之后,那么排出来的数字,6也只能在3之后(631、632就不行)

这个很简单,排列组合问题,matlab里都有自带的函数,一搜就有
1、combntns(x,m)
列举出从n个元素中取出m个元素的组合。其中,x是含有n个元素的向量。
2、perms(x)
给出向量x的所有排列 (permutation)。
这题既然你都这么说了,那就不需要排列出所有结果了,123,213都一样,用第一个函数就行
3、unique(x)去除重复的元素。
你的作业要求里要写个app的界面,做一个输入框用于输入学号,一个输出框用于显示组合结果,把功能函数直接复制过去修改一下变量就可以了,app.x那种


请参考

img