在matlab中使用两个向量的随机采样创建向量

时间:2013-04-15 20:26:47

标签: matlab

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

例如

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

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

谢谢,

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

要获得一个混合样本,您可以使用以下代码片段的概念(不是最佳代码片段,但可能足够清晰):

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;

答案 2 :(得分:0)

更一般地说,如果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);

答案 3 :(得分:0)

如果我理解你的问题,你会选择两个随机数。首先,您决定是选择向量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”或“2”中选择“元素1”,然后从“1或2”中选择“元素2”等,以获取向量的所有元素。在那种情况下,做

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

答案 4 :(得分:0)

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