生成具有 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, :);
我想生成一个二维矩阵 (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, :);