0

我正在使用 MATLAB 并尝试为心理实验运行不同条件的随机块。我有我想尝试的“级别”,每个级别 3 次。所以我想基本上将向量的三个副本排列在一起。到目前为止,我有:

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

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

4

3 回答 3

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
于 2012-07-03T18:27:29.977 回答
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)
于 2012-07-03T18:07:27.300 回答
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 开始)一起工作所必需的。

于 2012-07-03T18:08:07.293 回答