使用八度/ matlab中的唯一行生成随机2D矩阵

时间:2015-04-22 02:25:26

标签: matlab octave

我想生成一个2D矩阵(1000x3),其中随机值的范围为1到10(八度)。使用randi(10,1000,3)将生成具有重复行值的矩阵。但我想生成唯一(不重复)的行。有什么办法吗,我能做到吗?

2 个答案:

答案 0 :(得分:2)

您可以通过获取笛卡尔积来创建所有可能性并按如下方式对阵列进行洗牌,从而轻松实现。要创建笛卡尔积,您需要生成cartprod.m function的自定义cartesian product

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

然后,以下行随机播放笛卡尔积[{1}}。

C

注意:

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

答案 1 :(得分:2)

您可以使用以下函数生成从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, :);