【问题标题】:Creating a vector with random sampling of two vectors in matlab在matlab中创建一个随机采样两个向量的向量
【发布时间】:2013-04-15 20:26:46
【问题描述】:

如何创建一个由其他两个向量的随机抽样组成的向量?

例如

向量 1 [1, 3, 4, 7],向量 2 [2, 5, 6, 8] 随机向量[从向量 1 或 2(值 1 或 2)随机抽取,从向量 1 或 2(值 3 或 5)随机抽取...等]

最后,如何让matlab重复这个过程n次来绘制结果分布?

谢谢,

【问题讨论】:

    标签: matlab


    【解决方案1】:

    有很多方法可以做到这一点。一种可能是:

    tmp=round(rand(size(vector1)))
    res = tmp.*vector1 + (1-tmp).*vector2
    

    【讨论】:

    • 这更快,因为没有产品:res=vector1; res(tmp)=vector2(tmp)
    【解决方案2】:

    要获得一个混合样本,您可以使用以下代码 sn-p 的想法(不是最佳的,但可能足够清晰):

    a        = [1, 3, 4, 7];
    b        = [2, 5, 6, 8];
    selector = randn(size(a));
    sample   = a.*(selector>0) + b.*(selector<=0);
    

    对于n 示例,将上述代码放入for 循环中:

    for k=1:n
        % Sample code (without initial "samplee" assignments)
        % Here do stuff with the sample
    end;
    

    【讨论】:

    • 你可以简单地用randn()创建n行。
    • 确实如此。 :-) 我选择了更直观的方法(至少对我而言)。
    【解决方案3】:

    更一般地说,如果 X 是一个矩阵,并且您希望从随机选择的列中抽取每一行的样本,则可以使用循环来执行此操作:

    y = zeros(size(X,1),1);
    for ii = 1:size(X,1)
        y(ii) = X(ii,ceil(rand*size(X,2)));
    end
    

    您可以通过 sub2ind 使用巧妙的索引来避免循环:

    idx_n = ceil(rand(size(X,1),1)*size(X,2));
    idx   = sub2ind(size(X),(1:size(X,1))',idx_n);
    y = X(idx);
    

    【讨论】:

      【解决方案4】:

      如果我理解您的问题,您选择的是两个随机数。首先你决定是选择向量1还是向量2;接下来,您从所选向量中选择一个元素。

      以下代码利用了vector1和vector2长度相同的事实:

      N = 1000;
      sampleMatrix = [vector1 vector2];
      M = numel(sampleMatrix);
      randIndex = ceil(rand(1,N)*M); % N random numbers from 1 to M
      randomNumbers = sampleMatrix(randIndex); % sample N times from the matrix
      

      然后您可以显示结果,例如

      figure; hist(randomNumbers); % draw a histogram of numbers drawn
      

      当vector1 和vector2 有不同的元素时,就会遇到问题。如果你将它们连接起来,你最终会更频繁地从较长的向量中挑选元素。解决此问题的一种方法是从两个数组中创建随机抽样,然后在它们之间进行选择:

      M1 = numel(vector1);
      M2 = numel(vector2);
      r1 = ceil(rand(1,N)*M1);
      r2 = ceil(rand(1,N)*M2);
      randMat = [vector1(r1(:)) vector2(r2(:))]; % two columns, now pick one or the other
      randPick = ceil(rand(1,N)*2);
      randomNumbers = [randMat(randPick==1, 1); randMat(randPick==2, 2)];
      

      在重新阅读时,也许您只想为向量的所有元素选择“元素 1 从 1 或 2”,然后“从 1 或 2 中选择元素 2”,等等。在这种情况下,做

      N=numel(vector1);
      randPick = ceil(rand(1,N)*2);
      randMat=[vector1(:) vector2(:)];
      randomNumbers = [randMat(randPick==1, 1); randMat(randPick==2, 2)];
      

      【讨论】:

        【解决方案5】:

        这个问题可以使用函数datasample来解决。 将两个向量合并为一个并应用该函数。与其他答案中的手工版本相比,我更喜欢这种方法。它让您可以更灵活地选择您真正想要的东西,同时又是单线。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-24
          • 1970-01-01
          • 1970-01-01
          • 2020-08-08
          • 1970-01-01
          • 1970-01-01
          • 2019-11-19
          • 1970-01-01
          相关资源
          最近更新 更多