2017-02-17 2 views
1

En utilisant MATLAB, j'ai plusieurs matrices 8760x1. Je dois choisir au hasard des données de la première, puis sélectionnez les données des autres matrices, mais les données qui se trouve sur la même position que obtenu de la première à savoirComment puis-je sélectionner des échantillons aléatoires de plusieurs matrices dans MATLAB?

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

Je DataSample [DAA], alors je dois sélectionner [FHI], cet ordre, me donner:

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

est datasample le meilleur outil pour cela? Ou comment puis-je le faire? Merci.

+1

Utilisation DataSample pour data1 avec la deuxième sortie également capturé. Utilisez la deuxième sortie de datasample pour indexer dans data2 et autres. – Navan

+0

Choisissez-vous ** avec ** ou ** sans ** remplacement? – rayryeng

+0

J'utilisais sans mais sans succès mais la solution fournie par @TonyTannous a fonctionné. Cependant, je dois faire quelque chose d'un peu plus complexe, si possible. J'ai correctement extrait laisse dire 6000 des 8760 nombres mais je dois extraire plus de 1500 ** seulement ** des 2760 restants et alors, les 1260 restants sur un troisième vecteur. – Paulos

Répondre

1

DataSample servira bien, aussi longtemps que vous utilisez le formulaire non-remplacement (je suppose que vous ne voulez pas de sortie répétée. Si vous êtes ok avec ça, alors ignorer le « Remplacer » drapeau). La sortie d'index sera également non triés, vous pouvez parfaitement l'utiliser pour données2:

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

Je vois que vous aussi « besoin d'extraire de façon aléatoire plus 1500 seulement le reste 2760 puis, le 1260 reste sur un troisième . vecteur ", vous pouvez utiliser les informations IDX ignorer cet ensemble:

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

merci! Cela fonctionne parfaitement. @ana Si cela ne vous dérange pas, laissez-moi vous demander autre chose: Si l'entrée 'data1' est un' 8760x2' au lieu de '8760x1', comme j'essaie, le premier datasampling fonctionne bien, et renvoie un' 6000x2' matrice, cependant, le retour restant un '1500x1' et 1260x1' – Paulos

+1

Ok, l'a fait en ajoutant': 'à' (idx_notused, :) '. Merci! – 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); 

EDIT

[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

Attention à expliquer ce que ces 2 représentent sur randperm? – Paulos

+0

@Paulos, oui désolé ... 's (2)' est la taille du vecteur et 2 est le nombre de valeurs que je voulais choisir. Vous pouvez mettre n'importe quel nombre 'randperm (s (2), n)' au lieu de n. Aussi longtemps est-il plus petit ou égal au nombre total de valeurs dans le vecteur. –

+0

J'obtenais un 'k> n'error là mais j'ai remarqué que mes données d'entrée étaient en effet' 8760x1' et non '1x8760' donc, j'ai placé un' randperm (s (1), n) '. Ensuite, j'ai dû transposer 'mat1 (v)' et 'mat2 (v)' sur 'ret' pour le réparer. Je ne sais pas s'il existe un moyen plus facile de le "réparer". – Paulos

0

Je crois que la solution ci-dessous répond à vos besoins. Dans le vecteur k2, vous aurez n indices distincts à utiliser dans les matrices que vous voulez.

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

pour l'échantillonnage sans répétitions, vous pouvez utiliser randperm, le fait que vous rééchantillonnez à partir des mêmes données en « morceaux » de 1500 éléments ou si , ne change pas le fait fondamental que vous échantillonnez sans répétition. Donc, tout ce dont vous avez besoin est de réorganiser toutes les données, puis le remodeler dans la taille souhaitée:

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 

maintenant que vous avez dans chaque colonne de out s sur l'échantillon à partir des données, et vous avez N colonnes pour rééchantillonnage les données N fois. Tout ce qui reste dans les vecteurs d'origine est dans les left s.

Un exemple de résultat:

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

Quel est le problème avec mes réponses qui est similaire à la vôtre? + il voulait prendre un autre échantillon à partir des données restantes. –

+1

@TonyTannous droite, j'ai remarqué son autre question après que j'ai posté cela, et n'a pas eu le temps de le réparer. – EBH

+0

@TonyTannous bien maintenant je l'ai édité. – EBH