我想生成一个2D矩阵(1000x3),其中随机值的范围为1到10(八度)。使用randi(10,1000,3)将生成具有重复行值的矩阵。但我想生成唯一(不重复)的行。有什么办法吗,我能做到吗?
答案 0 :(得分:2)
您可以通过获取笛卡尔积来创建所有可能性并按如下方式对阵列进行洗牌,从而轻松实现。要创建笛卡尔积,您需要生成cartprod.m function的自定义cartesian product。
C = cartprod(1:10,1:10,1:10);
然后,以下行随机播放笛卡尔积[{1}}。
C
注意:
S = C(randperm( size(C,1) ),:);
中的每一行都是唯一的,您可以验证S
。答案 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, :);