如何创建一个由其他两个向量的随机抽样组成的向量?
例如
向量 1 [1, 3, 4, 7],向量 2 [2, 5, 6, 8] 随机向量 [从向量 1 或 2(值 1 或 2)随机抽取,从向量 1 或 2 随机抽取(值 3)或5)...等]
最后,如何让 matlab 重复这个过程 n 次来绘制结果分布?
谢谢,
如何创建一个由其他两个向量的随机抽样组成的向量?
例如
向量 1 [1, 3, 4, 7],向量 2 [2, 5, 6, 8] 随机向量 [从向量 1 或 2(值 1 或 2)随机抽取,从向量 1 或 2 随机抽取(值 3)或5)...等]
最后,如何让 matlab 重复这个过程 n 次来绘制结果分布?
谢谢,
有很多方法可以做到这一点。一种可能性是:
tmp=round(rand(size(vector1)))
res = tmp.*vector1 + (1-tmp).*vector2
如果我理解您的问题,那么您正在选择两个随机数。首先你决定是选择向量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)];
更一般地说,如果 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);
要获得一个混合样本,您可以使用以下代码片段的想法(不是最佳的,但可能足够清晰):
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;
这个问题可以使用函数datasample来解决。将两个向量合并为一个并应用该函数。与其他答案中的手工版本相比,我更喜欢这种方法。它为您提供了更大的灵活性来选择您真正想要的东西,同时是一个单线。