可以对这个随机采样环进行矢量化以进行优化吗?

时间:2019-01-22 21:34:28

标签: for-loop vectorization octave permutation

我试图在下面的代码中找到如何向量化FOR循环:

h=load('water-column');                 % load file 
perm=5;                         % make 10000 permutation
n_1=5;                            % number of random sample
dm_ale=zeros(1,perm);               % create a vector 
sz=length(h);                     % count size of matrix data    
for k=1:perm                      % making loop for the permutation
    i_1=randsample(sz,n_1);      
    x_3=h(i_1);            
    x_4=h(setdiff(1:sz,i_1));    
    dm_ale(k)=abs(mean(x_3)-mean(x_4)); % calculate difference of mean for each permutation
end

对于文件输入,我有类似的内容(只是一个示例,实际文件包含更多数据):

   3792.615000000000
   3792.625000000000
   3792.634000000000
   3792.640000000000
   3792.647000000000
   3792.654000000000
   3792.662000000000
   3792.668000000000
   3792.673000000000

我不知道可以将增量放在矢量化语句中的哪个位置。有可能将其向量化吗?

正如克里斯·伦戈(Cris Luengo)提出的代码(对不起,我不知道如何标记用户),我遇到了错误:

error: randsample: The input k must be a non-negative integer. Sampling without replacement needs k <= n.
error: called from
    randsample at line 46 column 5
    random_sampling at line 8 column 5

其中random_sampling是代码的名称。

最初,我需要拥有perm = 10000(以进行可靠的随机抽样测试)和n_1 = 600(需要进行测试的人口数量)。即使我遵守以下条件,上面的代码似乎也不起作用:n_1^2 << perm。 我假设错误是由于n_1引起的,而与perm相关的问题仍然足够大。 还有其他线索吗?我正在考虑增加perm

1 个答案:

答案 0 :(得分:1)

您不能使用randsample一次生成多个随机样本(或者从阅读文档中可以看出)。如果h足够大,并且permn_1足够小(sz >> perm*n_1),则可以使用{{ 1}}元素,然后将其分成perm*n_1个集合。大概可以,但是与您现在所做的不完全相同。

您的代码将如下所示(使用Geoffrey Brent in a comment建议的简化形式):

perm

如果h = load('col-deau'); perm = 5; n_1 = 5; sz = numel(h); % numel is always better than length if you use one index h(i_1) rather than two h(i_1,1) sum_h = sum(h) i_1 = randsample(sz, n_1 * perm); i_1 = reshape(i_1, n_1, perm); x_3 = h(i_1); % x_3 has the same size as i_1 x_3 = sum(x_3, 1); % sum over columns, x_3 has perm elements now x_4 = sum_h - x_3; dm_ale = abs(x_3 / n_1 - x_4 / (sz-n_1)); 也很大(如注释中所示),但perm仍然很小,则可以使用随机抽样替换来近似(用小的n_1,您在一组中重复元素的机会很小):

n_1