在Matlab上进行多次不同尺寸的采样

时间:2014-12-17 10:09:58

标签: matlab random-sample

我正在尝试实现此代码,以便尽快运行。

假设我拥有100个不同的值,您可以将其视为pop = 1:100pop = randn(1,100)以保持简单。我有一个向量n,它给出了我想要的样本大小。比方说,n=[1 3 10 6 2]。我想要做的是取5(实际上是length(n)pop的不同样本,每个样本由n(i)个元素组成,无需替换。这意味着,对于我的第一个样本,我想要pop中的1个元素,对于我想要的第二个样本3,对于第三个我想要10个,依此类推。

老实说,我对哪些元素的抽样并不感兴趣。我想得到的是 i 样本中存在的那些元素的总和。如果我用循环实现它,这将是微不足道的,但我试图避免使用它们尽可能快地保持我的代码。我必须为许多不同的人群做这件事,length(n)非常大。

如果我必须使用循环,这将是如何:

pop = randn(1,100);
n = [1 3 10 6 2];
sum_sample = zeros(length(n),1);
for i = 1:length(n)
  sum_sample(i,1) = sum(randsample(pop,n(i)));
end

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:1)

找出最快的方法的唯一方法是对不同的方法进行比较。

实际上在这种情况下,循环似乎非常快

pop = randn(1,100);
n = [1 3 10 6 2];

tic
sr = @(n) sum(randsample(pop,n));
sum_sample = arrayfun(sr,n);
toc %% Returns about 0.004

clear su
tic
for t=numel(n):-1:1
    su(t)=sum(randsample(pop,n(t)));
end
toc %% Returns about 0.003

答案 1 :(得分:0)

您可以创建一个函数句柄,用于选择随机样本并对其进行求和。然后,您可以使用arrayfun为n:

的所有值执行此函数
pop = randn(1,100);
n = [1 3 10 6 2];
sr = @(n) sum(randsample(pop,n));
sum_sample = arrayfun(sr,n);

答案 2 :(得分:0)

您可以这样做:

pop = randn(1,100);
n = [1 3 10 6 2];
sampled_data_index = randi(length(pop),1,sum(n));
sampled_data = pop(sampled_data_index);

randi函数随机选择适合索引的指定范围内的整数值。获得索引后,您可以一次性使用这些索引来从pop数据库中采样数据。

如果您想拥有唯一索引,可以将randi函数替换为randperm

sampled_data_index = randperm(length(pop),sum(n));

<强>最后:

您可以使用以下代码将所有采样值作为单元格变量:

pop = randn(1,100);
n = [1 3 10 6 2];
fun = @(m) pop(randperm(length(pop),m));
C = arrayfun(fun,n,'UniformOutput',0)

还有采样数据的总和:

funs = @(m) sum(pop(randperm(length(pop),m)));
sumC = arrayfun(funs,n)