有没有办法在 randperm 中获得不同的洗牌?
Is there any way to obtain different shuffled in randperm?
我有一个矩阵 [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]
您可以轻松地使用 MATLAB 函数 ismember
来检查您刚刚创建的随机排列是否已包含在您的矩阵中。
所以你可以尝试这样的事情:
for i=1:4
temp = randperm(4);
while ismember(m,temp,'rows')
temp = randperm(4);
end
m(i,:) = temp;
end
您可以只检查现有行以查看当前排列是否已经存在
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
另一种(内存密集型)方法是生成 所有 排列,然后随机生成 select N 个排列
allperms = perms(1:4);
N = 4;
m = allperms(randsample(size(allperms,1), N), :);
我有一个矩阵 [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]
您可以轻松地使用 MATLAB 函数 ismember
来检查您刚刚创建的随机排列是否已包含在您的矩阵中。
所以你可以尝试这样的事情:
for i=1:4
temp = randperm(4);
while ismember(m,temp,'rows')
temp = randperm(4);
end
m(i,:) = temp;
end
您可以只检查现有行以查看当前排列是否已经存在
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
另一种(内存密集型)方法是生成 所有 排列,然后随机生成 select N 个排列
allperms = perms(1:4);
N = 4;
m = allperms(randsample(size(allperms,1), N), :);