生成具有 octave/matlab 中唯一行的随机二维矩阵

Generate random 2D matrix with unique rows in octave/matlab

我想生成一个二维矩阵 (1000x3),其随机值在 1 到 10 的范围内,以八度为单位。使用 randi(10,1000,3) 将生成具有重复行值的矩阵。但我想生成唯一的(不重复的)行。有什么办法,我可以做到吗?

您可以轻松地做到这一点,方法是让笛卡尔积创建所有可能性并按如下方式随机排列数组。要创建笛卡尔积,您需要我的自定义 cartprod.m function that generates a cartesian product.

C = cartprod(1:10,1:10,1:10);

接下来的行打乱了笛卡尔积 C

S = C(randperm( size(C,1) ),:);

备注:

  • S 中的每一行都是唯一的,您可以验证 size( unique( S ) ) == 1000.
  • 我应该注意到这段代码适用于 Matlab 2015a。我没有在 Octave 中测试过它,OP 似乎正在使用它。我被告知语法几乎相同。

您可以生成从 1 到 10 的所有可能的三项序列,并使用以下函数进行替换:

function result = nchoosek_replacement(n, k)

    %// Edge cases: just return an empty matrix 
    if k < 1 || n < 1 || k >= n
        result = [];
        return
    end

    reps = n^(k-1);
    result = zeros(n^k, k);
    cur_col = repmat(1:n, reps, 1);
    result(:,1) = cur_col(:);

    %// Base case: when k is 1, just return the
    %// fully populated matrix 'result'
    if k == 1
        return
    end

    %// Recursively generate a matrix that will
    %// be used to populate columns 2:end
    next = nchoosek_replacement(n, k-1);

    %// Repeatedly use the matrix above to
    %// populate the matrix 'result'
    for i = 1:n
        cur_range = (i-1)*reps+1:i*reps;
        result(cur_range, 2:end) = next;
    end

end 

定义此函数后,您现在可以生成所有可能的序列。在这种情况下,恰好有 1000 个,因此可以简单地用 randperm 对它们进行洗牌。一种更通用的方法是使用 randsample 从它们中采样,如果需要,这也允许使用更小的矩阵:

max_value = 10;
row_size = 3;    
num_rows = 1000;

possible = nchoosek_replacement(max_value, row_size);
indices = randsample(size(possible, 1), num_rows);
data = possible(indices, :);