2017-02-17 42 views
1

使用MATLAB,我有几个8760x1矩阵。我需要随机地从第一个选择一些数据,然后选择从另一矩阵中的数据,但是这是在相同的位置,从所述第一即如何从MATLAB中的几个矩阵中选择随机样本?

data1 = [a b c d e]; 
data2 = [f g h i j]; 

我datasample [ACD]获得了数据,然后我需要选择[FHI],此订单上,给我:

out1 = [a c d] 
out2 = [f h i] 

datasample这个最好的工具?或者我该怎么做? 谢谢。

+1

用于与第二输出数据1使用datasample还捕获。使用数据采样的第二个输出来索引data2和其他数据。 – Navan

+0

您是否选择**并带**或**而不带**替换? – rayryeng

+0

我在没有但没有成功的情况下使用,但@TonyTannous提供的解决方案工作。但是,如果可能的话,我需要做一些更复杂的事情。我正确地提取了可以说的8760个数字中的6000个,但我需要随机提取更多1500 ** **其余2760个,然后剩下的1260个第三个向量。他想要独特的@rayryeng – Paulos

回答

1

Datasample将更好地服务,只要您使用非替换形式(我猜你不想重复输出。如果你确定这一说法,则忽略该“替换”标志)。该指数的输出也将是未排序的,这样你就可以完美地将它用于数据2:

data1 = [a b c d e]; 
data2 = [f g h i j] 
[out1,idx] = datasample(data1,k,'Replace',false); 
out2=data2(idx); 

我看你也是“只需要以随机抽取更多1500的第三剩余的2760,然后,剩余的1260 。矢量“,你可以使用IDX信息不理那一套:

idx_notused=setdiff(1:size(data1,1),idx); %finds all positions not selected previously 
[out1_v2,idx2] = datasample(data1(idx_notused),k,'Replace',false); %k=1500 
idx2=idx_notused(idx2); %so it maps with the original data 
out2_v2=data2(idx2); 

%and again for the remaining 1260: 
idx_remaining=setdiff(1:size(data1,1),[idx idx2]); 
out1_v3=data1(idx_remaining); 
out2_v3=data2(idx_remaining); 
+0

谢谢!它的工作完美无瑕。 @ana如果你不介意,让我问你一些其他的问题:如果输入'data1'是一个8760x2而不是8760x1,正如我尝试的那样,第一个数据采样工作正常,并且返回一个'6000x2'矩阵,但是,其余的返回'1500x1'和1260x1' – Paulos

+1

好吧,通过将':'添加到'(idx_notused,:)'来实现。谢谢! – Paulos

0
mat1 = [4, 3, 5, 4]; 
mat2 = [1, 1, 2, 2]; 

s = size(mat1); 
[v] = randperm(s(2), 2); <--- remember the indices 


ret = mat1(v); 
ret = [ret; mat2(v)]; 
enter code here 


out1 = ret(1, 1:end); 
out2 = ret(2, 1:end); 

编辑

[v] is a 1/0 vector which represents the places chosen to pick from values. 
now to choose from the data left, we need to extract the data not picked and 
pick from it. 

v2 = (1-v); 
TempMat = Mat(v2); 

TempMat is the remaining data not picked in first place. 
+0

小心解释那些2在randperm上代表什么? – Paulos

+0

@Paulos,对不起... '(2)'是向量的大小,2是我想要选择的值的数量。你可以把你想要的任何数字'randperm(s(2),n)'而不是n。只要它小于或等于向量中值的总数即可。 –

+0

我在那里遇到了'k> n''错误,但是我注意到我的输入数据的确是'8760x1',而不是'1x8760',所以我放了一个'randperm(s(1),n)'。然后,我必须在'ret'上转换'mat1(v)'和'mat2(v)'来修复它。不知道是否有更简单的方法来“修复”它。 – Paulos

0

我认为,解决下面将满足您的需求。在矢量k2中,你将有n个不同的索引用于你想要的矩阵中。

k1=randperm(length(data1)); 
k2=k1(1:n) % row of n samples 
out1=data1(k2); 
out2=data2(k2); 
0

对于不重复抽样,您可以使用randperm,您从同一数据在1500元左右的‘块’重新取样的事实,不会改变您抽样而不重复的基本事实。所以,你需要的是重新排序的所有数据,然后将其重新塑造成你想要的大小:

data1 = ('abcdewryt').'; 
data2 = ('fghijvbnm').'; 
k = 2; % samlpe size 
N = 3; % no. of times to resample 
rand_ind = randperm(size(data1,1)); % reorder all your data 
out1 = reshape(data1(rand_ind(1:k*n)),[k,n]); % extract output from data1 in a shuffled order 
out2 = reshape(data2(rand_ind(1:k*n)),[k,n]); % extract output from data2 in a shuffled order 
left1 = data1(rand_ind(k*n+1:end)); % all what's left in data1 
left2 = data1(rand_ind(k*n+1:end)); % all what's left in data2 

现在你必须在从数据样本的out s分别列,你必须重新取样N列数据N次。原始矢量中剩下的全部内容都在left s中。

结果的一个例子:

out1 = 
ywb 
det 
out2 = 
nvg 
ijm 
left1 = 
a 
r 
c 
left2 = 
a 
r 
c 
+0

我的答案和你的相似有什么不对? +他想从剩余的数据中再抽取一个样本。 –

+1

@TonyTannous你是对的,我发布后我注意到他的其他问题,并没有时间来解决它。 – EBH

+0

@TonyTannous现在我已经编辑它。 – EBH