在matlab中创建10x2矩阵的最佳方法是什么,其中每个元素是1-5之间的随机int,因此这个数组中只有唯一的元素对?我知道randperm可以给我一个随机的唯一数字,但我不确定是否有可能使用randperm给出独特的对?我能想到的另一种方法是使用:
randi([1 5], 10, 2);
在一个带有if语句的循环中,检查所有对是否都是唯一的。 我想要的数据示例如下:
4 5
1 3
2 2
1 4
3 3
5 1
5 5
2 1
3 1
4 3
注意:元素的顺序无关紧要,例如,4,5和5,4都是有效的。
答案 0 :(得分:5)
首先将所有可能的对生成为矩阵的行,然后使用randperm
生成行索引的随机子集:
N = 5; %// alphabet size
M = 2; %// number of columns
P = 10; %// desired number of rows
allPairs = dec2base(0:N^M-1, N)-'0'+1; %// generate all possible rows
ind = randperm(size(allPairs,1)); %// indices for random permutation of rows
ind = ind(1:P); %// pick P unique indices
result = allPairs(ind,:); %// use those indices to select rows
示例结果:
result =
3 2
1 4
3 5
4 1
1 3
1 2
2 4
3 4
5 5
1 5
答案 1 :(得分:3)
这是使用randperm
&的另一种方法。没有生成所有可能行的内存开销的dec2base
(引用Luis's solution
) -
%// Inputs
start = 1
stop = 5
Nr = 10 %// Number of rows needed
Nc = 2 %// Number of cols needed
intv = stop - start + 1; %// Interval/range of numbers
rand_ID = randperm(power(intv,Nc)-1,Nr); %// Unique IDs
out = dec2base(rand_ID,intv) - '0'+ start %// 2D array of unique numbers
样品运行 -
案例#1(与所列问题相同的参数):
start =
1
stop =
5
Nr =
10
Nc =
2
out =
1 3
2 1
5 3
5 4
5 5
3 4
2 3
2 5
3 3
1 4
案例#2(不同参数):
start =
1025
stop =
1033
Nr =
10
Nc =
5
out =
1030 1029 1033 1028 1029
1033 1029 1026 1025 1025
1028 1026 1031 1028 1030
1028 1031 1027 1028 1025
1033 1032 1031 1029 1032
1033 1029 1030 1027 1028
1031 1025 1032 1027 1025
1033 1033 1025 1028 1029
1031 1033 1025 1033 1029
1028 1025 1027 1028 1032
答案 2 :(得分:1)
根据excaza的评论,我发现这符合我的需求:
n = randperm(5);
k = 2;
data = nchoosek(n, k);
其中给出了一些示例输出:
2 3
2 4
2 1
2 5
3 4
3 1
3 5
4 1
4 5
1 5