我试图在下面的代码中找到如何向量化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
。
答案 0 :(得分:1)
您不能使用randsample
一次生成多个随机样本(或者从阅读文档中可以看出)。如果h
足够大,并且perm
和n_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