2017-02-17 44 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