我有一系列的数字:
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5]
我想randomely填入一个3x5的矩阵,而不必在同一行中相同的编号。
我怎样才能做到这一点在MATLAB? 可能我可以随机测试向量,并填写到5X3矩阵,但我不知道如何做到这一点没有得到在同一行中相同的编号。
我有一系列的数字:
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5]
我想randomely填入一个3x5的矩阵,而不必在同一行中相同的编号。
我怎样才能做到这一点在MATLAB? 可能我可以随机测试向量,并填写到5X3矩阵,但我不知道如何做到这一点没有得到在同一行中相同的编号。
如果你想填补一个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
你可以把测试的独特的矩阵,并选择任意三个元素了出来,并在需要的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
下面是做这件事的蛮力方式
% 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);