我有一个矩阵[1 2 3 4]
,我想用randperm
几次洗牌,但我想获得不同的矩阵。例如
for i=1:4
m(i,:)=randperm(4);
end
会给我4行4列,但我希望每一行与其他每一行不同;例如像这样:
m(1,:)=[1 3 4 2]
m(2,:)=[2 3 1 4]
m(3,:)=[2 1 4 3]
m(4,:)=[4 3 2 3]
答案 0 :(得分:3)
您只需检查现有行以查看当前排列是否已存在
m = zeros(4, 4);
counter = 1;
while counter < 4
new = randperm(4);
if ~ismember(new, m, 'rows')
m(counter, :) = new;
counter = counter + 1;
end
end
另一种(内存密集型)方法是生成所有排列,然后随机选择其中的N个
allperms = perms(1:4);
N = 4;
m = allperms(randsample(size(allperms,1), N), :);
答案 1 :(得分:1)
您可以轻松使用MATLAB函数ismember
来检查您刚创建的随机排列是否已包含在矩阵中。
所以你可以试试这样的事情:
for i=1:4
temp = randperm(4);
while ismember(m,temp,'rows')
temp = randperm(4);
end
m(i,:) = temp;
end