MATLAB - 创建2d独特对数组的最佳方法?

时间:2015-11-24 15:18:18

标签: arrays matlab random

在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都是有效的。

3 个答案:

答案 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