2011-09-01 61 views
0

我试图在实验过程中得到一些刺激的排序,但对以下内容有轻微的问题。所以我有一个8位图像的清单,每个数字都是1 - 8。我需要在每个试验中显示2位数字。所以每个数字都需要显示9次,总共有72次演示。但是,相同的试验中不能出现相同的两位数字。另外,我不能经常出现两个相同的数字。当在Matlab中重复和随机化一个矩阵时约束洗牌

我尝试了几种不同的方法,但不断得到奇数双。

例如,如果我这样做:

images = [ 1 2 3 4 5 6 7 8]; 
images = Shuffle(images); 
images = repmat(images, 1, 9); 
images = reshape(images, 36, 2); 
images = shake(images, 2) %where shake is a function that shuffles the rows 

它不给你在同一行中相同的数字,但相同的数字总是出现在一起,例如。你会得到3 6,然后6 3

因为它不一定是36 x 2基准的形式,它可能是72 x 1矢量 - 我想一个选项可能是重复和洗牌该行,将洗牌放入一个循环内以约束任何双重上升,

例如

not_good = true; 
while not_good 
not_good = false; 
vector = shuffle(repeated_vector); 
if (gets a bit hazy here, something to say if two consecutive values are equal) 
not_good = true; 
end 
end 

但老实说,我很乐意提供建议,任何帮助/澄清将不胜感激。

+1

我还不是很清楚:你想反复从8张图片中选择2位数字(没有替换)..是否还有其他要求?也许你正在寻找[NCHOOSEK](http://www.mathworks.com/help/techdoc/ref/nchoosek.html)函数:'nchoosek(1:8,2)'给出了8位数字的所有组合2一次。 – Amro

+0

@Lau:如果答案对您有用,那么您可以通过点击乐谱旁边的向上箭头来使其成功。 –

回答

0

像Amro说的那样:使用nchoosek来获得所有图像对。

然后按照randperm随机发出订单。

nImages = 8; 
pairs = nchoosek(1:nImages, 2); 
nPairs = size(pairs, 1); 
order = randperm(nPairs); 
randomisedPairs = pairs(order, :)