具有重复的排列

时间:2012-07-03 17:53:50

标签: matlab mapping permutation

我正在使用MATLAB并试图为心理实验运行一个不同条件的随机区块。我有'水平'我想尝试,每次3次。所以我想基本上将这三个载体复制在一起。到目前为止,我有:

levels = [0 0.25 0.5 0.75 1]
permutationIndices = randperm(length(levels)*3)

...然后在这里,我的自然解决方案将是一个映射函数,它使用mod 5将任何级别映射到相应的位置,例如在permutationIndices中,只要有1,6或11,数字0将被插入。我怎么能这样做(或者,有更简洁的方式吗?)谢谢。

3 个答案:

答案 0 :(得分:1)

mod(randperm(15)-1,5)+1

此输出

5   4   5   1   3   2   1   1   4   3   3   2   4   5   2

或另一次运行:

3   4   4   2   2   5   3   2   4   1   3   1   5   5   1

您可以使用它从水平向量中获取相应的元素:

output = levels(mod(randperm(15)-1,5)+1)

答案 1 :(得分:1)

尝试:

%# three copies of levels
x = repmat(1:numel(levels),1,3)

%# random permuation
[~,ord] = sort(rand(size(x)));
output = x(ord)

例如:

output =
     3     2     4     2     5     4     5     2     3     1     5     3     1     1     4

答案 2 :(得分:0)

mod方法可能是最简单的方法。我会为长度为nlevels * ntimes的数组生成置换索引,然后mod这些索引将索引到实际级别值的数组中。

level_values = [0 0.25 0.5 0.75 1];
nlevels = numel(level_values);
ntimes = 3;

lv_inds = 1 + mod( randperm(ntimes*nlevels - 1), nlevels);
levels = level_values( lv_inds );

奇数1 +- 1偏移量是使mod调用使用Matlab的数组索引(从1开始)所必需的。