我正在使用MATLAB并试图为心理实验运行一个不同条件的随机区块。我有'水平'我想尝试,每次3次。所以我想基本上将这三个载体复制在一起。到目前为止,我有:
levels = [0 0.25 0.5 0.75 1]
permutationIndices = randperm(length(levels)*3)
...然后在这里,我的自然解决方案将是一个映射函数,它使用mod 5将任何级别映射到相应的位置,例如在permutationIndices中,只要有1,6或11,数字0将被插入。我怎么能这样做(或者,有更简洁的方式吗?)谢谢。
答案 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开始)所必需的。