我正在尝试实现此代码,以便尽快运行。
假设我拥有100个不同的值,您可以将其视为pop = 1:100
或pop = 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
有办法做到这一点吗?
答案 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)