Matlab随机抽样数据集

时间:2014-07-24 09:08:46

标签: arrays matlab random random-sample

我有一个数据集(数据),它是一个矢量,比如1000个实数。我想从数据中随机提取100次10个连续数字。我不知道如何将Datasample用于此目的。 在此先感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

你可以在1到991之间挑选100个随机数:

I = randi(991, 100, 1)

然后使用它们作为索引10个连续元素的起点:

cell2mat(arrayfun(@(x)(Data(x:x+9)), I, 'uni', false))

答案 1 :(得分:2)

这里有一个snipet,但我没有使用Datasample,而是使用randi来生成随机索引。

n_times = 100;
l_data = length(Data);

index_random = randi(l_data-9,n_times,1); % '- 9' to not to surpass the vector limit when you read the 10 items

for ind1 = 1:n_times
    random_number(ind1,:) = Data(index_random(ind1):index_random(ind1)+9)
end

答案 2 :(得分:2)

这与Dan's answer类似,但避免使用单元格和arrayfun,因此可能会更快。

Ns表示您想要的连续数字的数量(在您的示例中为10),以及Nt次数(在您的示例中为100)。然后:

result = Data(bsxfun(@plus, randi(numel(Data)-Ns+1, Nt, 1), 0:Ns-1)); %// Nt x Ns

答案 3 :(得分:0)

这是另一种解决方案,靠近@Luis,但使用cumsum代替bsxfun

A = rand(1,1000); % The vector to sample
sz = size(A,2);
N = 100; % no. of samples
B = 10; % size of one sample
first = randi(sz-B+1,N,1); % the starting point for all blocks
rand_blocks = A(cumsum([first ones(N,B-1)],2)); % the result

这导致N-by-B矩阵(rand_blocks),其每一行是一个样本。当然,这可能是一线的,但它不会让它更快,我想保持清醒。对于较小的NB,此方法稍快一些。如果NB变得非常大,则bsxfun方法会稍快一些。此排名不受A的大小影响。