我有一个数据集(数据),它是一个矢量,比如1000个实数。我想从数据中随机提取100次10个连续数字。我不知道如何将Datasample用于此目的。 在此先感谢您的帮助。
答案 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
),其每一行是一个样本。当然,这可能是一线的,但它不会让它更快,我想保持清醒。对于较小的N
或B
,此方法稍快一些。如果N
或B
变得非常大,则bsxfun
方法会稍快一些。此排名不受A
的大小影响。