本人遇到的问题是用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
已解决问题全部情况,望采纳,有问题请留言,看到就回,简单的修改可以自行尝试调试,感谢合作!