没有行重复自动填充矩阵(Auto-fill matrix without row-repetitio

2019-09-28 04:10发布

我有一系列的数字:

test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5]

我想randomely填入一个3x5的矩阵,而不必在同一行中相同的编号。

我怎样才能做到这一点在MATLAB? 可能我可以随机测试向量,并填写到5X3矩阵,但我不知道如何做到这一点没有得到在同一行中相同的编号。

Answer 1:

如果你想填补一个3×5矩阵中的所有值的test ,确保每一行有没有重复的值,则可以使用做到这一点非常简洁toeplitz首先生成一个索引矩阵,然后随机置换尺寸与randperm

index = toeplitz(1:3, [3 5:-1:2]);
index = index(randperm(3), randperm(5));

和样本index

index =

     1     5     4     2     3
     4     3     2     5     1
     5     4     3     1     2

如果您在值test是数字1到5,这应该是所有你需要做的。 如果test可以用5张不同的数,各三个中的任何载体,那么你就可以得到独特的价值观test向量和索引他们index 。 该解决方案将推广到任何test向量:

test = [3 3 3 7 7 7 5 5 5 9 9 9 4 4 4];    % Sample data
uniqueValues = unique(test);               % Get the unique values [3 4 5 7 9]
M = uniqueValues(index);                   % Use index as generated above

其结果将保证是什么在重新排序的版本test

M =

     3     9     7     4     5
     7     5     4     9     3
     9     7     5     3     4


Answer 2:

你可以把测试独特的矩阵,并选择任意三个元素了出来,并在需要的5X3矩阵填写。

test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;
A = zeros(5,3) ;
for i = 1:size(A,1)
    A(i,:) = randsample(test_unique,3) ;
end

randsample需要统计工具箱,如果没有它,你可以使用randperm,如下图所示。

test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;

A = zeros(5,3) ;
for i = 1:size(A,1)
    A(i,:) = test_unique(randperm(length(test_unique),3)) ;
end

如果你想3X5矩阵:

test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;
A = zeros(3,5) ;
for i = 1:size(A,1)
    A(i,:) = randsample(test_unique,5) ;
end


Answer 3:

下面是做这件事的蛮力方式

% data
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5];

% randomly permute the indices
indices = randperm(numel(test));

% create a random matrix
matrix = reshape(test(indices), 5, 3);

% while number of unique elements in any of the rows is other than 3
while any(arrayfun(@(x) numel(unique(matrix(x,:))), (1:size(matrix,1)).')~=3)
    % keep generating random matrices
    indices = randperm(numel(test));
    matrix = reshape(test(indices), 5, 3);   
end;

% here is the result
result=matrix;

编辑:如果你想3x5的就像你在您的评论中提到,这是一个容易得多。 下面只有一条线路。

[~, result] = sort(rand(3,5),2);


文章来源: Auto-fill matrix without row-repetitions