0

私はMATLABを使用しており、精神実験のためにさまざまな条件のランダム化ブロックを実行しようとしています。試してみたい「レベル」が3回あります。したがって、基本的に、ベクトルの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アプローチはおそらく最も単純です。length の配列の並べ替えられたインデックスを生成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 に答える