【问题标题】:Repeat random, unique sampling of k values n times对 k 值重复随机、唯一的抽样 n 次
【发布时间】:2021-06-04 01:59:31
【问题描述】:

在 Matlab 中,我想生成一个包含 4 个随机唯一样本(共 10 个)7 次的矩阵。 为了避免 for 循环,我想我可以重复我的数据并在第一个维度上使用来自 Statistics and Machine Learning Toolbox 的datasample。但它总是从每一列中选择相同的 4 个值,所以这有点没用。

考虑以下 MWE:

randomData  = [50.29; 47.72; 48.38; 48.02; 44.23; 47.17; 48.19; 49.11; 50.44; 53.40];

numOfReps               = 7;
numOfSamples            = 4;

randomDataRepMatrix     = randomData*ones(1, numOfReps);

s           = RandStream('mlfg6331_64');
y           = datasample(s, randomDataRepMatrix, numOfSamples, 'Replace', false);

即使没有 RandStream 部分,我也会得到相同的结果...

有什么想法吗?还是我需要使用 for 循环?

【问题讨论】:

  • 来自the documentation:您可以使用randirandperm 分别为随机抽样生成索引,无论是否替换。但是,datasample 使用起来更方便,因为它直接从您的数据中采样。
  • “为了避免 for 循环”。如果矢量化不是微不足道的,您应该始终实现 for 循环,并评估结果。这是您代码中的瓶颈吗?然后尝试优化它。否则,您只是在浪费时间,这与优化相反。循环在 MATLAB 中并不是天生就很慢,这种看法是 15 年前引入 JIT 之前的产物。

标签: matlab random


【解决方案1】:

我不认为datasamplerandsample 可以一次生成多组样本。这是一种“手动”的方法(不一定比使用带有循环的datasample 更快):

[~, ind] = sort(rand(numel(randomData), numOfReps)); % each column is a permutation
ind = ind(1:numOfSamples,:); % keep only the first values in each column
y = randomData(ind); % index into data

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多