我有一系列数字:
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5]
我希望randomely填充到3x5矩阵,而不是在同一行中有相同的数字。
我怎样才能在matlab中做到这一点?可能我可以将测试向量随机化并将其填充到5x3矩阵中,但我不知道如何在不在同一行中获得相同的数字的情况下执行此操作。
答案 0 :(得分:1)
如果要使用test
中的所有值填充3 x 5矩阵,确保每行没有重复值,可以使用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个不同数字的任何向量,每个向量中有3个,那么您可以获取test
向量的unique值并使用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
答案 1 :(得分:0)
这是一种蛮力的方式
% 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);
答案 2 :(得分:0)
您可以使用 test 的唯一矩阵,从中挑选任意三个元素并填写所需的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,:) = test_unique(randperm(length(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(3,5) ;
for i = 1:size(A,1)
A(i,:) = randsample(test_unique,5) ;
end
如果你想要3X5矩阵:
<helpers>
<googlecheckout>
<class>Mage_GoogleCheckout_Helper</class>
</googlecheckout>
</helpers>