我目前正在MATLAB中使用datasample
命令从具有9个不同数字的1x9向量中采样数据。示例代码:
test_durations = [5.0000, 5.9460, 7.0711, 8.4090, 10.000, 11.0668, 12.2474, 13.5540, 15.0000];
tduration = datasample (test_durations,1,'Replace', false);
这是一个for循环,这样在for循环的每次迭代中,代码都从上面的向量中提取一个新数字。所以在第一个循环中它拉出5.64960,然后在第二个循环上它拉出一个10,依此类推。
我的问题是代码将在每个数据点被采样之前重新采样它已经采样的数据。有没有办法告诉它没有替换的样本,并且在所有其他数据点首先被采样之前不重新采样?
我认为部分问题是for循环中datasample命令的范围仅限于循环的迭代。我希望它独立于循环,以便在重新采样之前对每个数据点进行一次采样。
答案 0 :(得分:1)
以下是我认为会做你想做的一些代码:
% some random data vector
data = rand(10,1);
N = numel(data);
% number of iterations you are performing
% (could be more or less than the number of data elements)
numIter = 25;
% compute sample indices without replacement
% (resampling will occur if numIter>N)
num = numIter;
idx = cell(ceil(numIter/N),1);
for i=1:numel(idx)
k = min(num,N);
num = num - k;
idx{i} = randperm(N, k);
end
idx = [idx{:}];
% main program loop
for i=1:numIter
val = data(idx(i));
% .. do something with sampled value
end
在上面的例子中,我得到以下样本索引:
>> idx
idx =
Columns 1 through 14
3 8 2 6 1 5 10 7 4 9 4 8 5 7
Columns 15 through 25
1 10 6 9 3 2 1 4 10 5 3
>> tabulate(idx)
Value Count Percent
1 3 12.00%
2 2 8.00%
3 3 12.00%
4 3 12.00%
5 3 12.00%
6 2 8.00%
7 2 8.00%
8 2 8.00%
9 2 8.00%
10 3 12.00%
因此,对于前十次迭代,它只是值的随机排列。在接下来的十次迭代中也会发生同样的事情。最后,在剩下的五个循环迭代中,选择了10个随机样本中的5个。