2015-09-09 122 views
3

假設我有長度N的陣列。我想隨機選擇n個位置,使它們爲零,然後將現有元素添加到下一個非零元素。數組操作 - 隨機選擇元素

例如,假設r = (r1,r2,r3,r4,r5)N = 5。讓n = 2。隨機挑選的職位是第三和第四。然後我想將r轉換爲 r_new = (r1, r2, 0, 0, r3+r4+r5)

相反,如果隨機選擇的位置是13,然後我想有 r_new = (0, r1 + r2, 0, r3+r4, r5)

我編碼在MATLAB。這是我目前的代碼。

u = randperm(T); 
ind = sort(u(1:n(i))); 
tmp = r(ind); 
r(ind) = 0; 

x = find(r); 

我不一定在尋找MATLAB代碼。僞代碼會很有幫助。

回答

1

我假設最後的位置永遠不能選擇,否則預期的行爲是不確定的。所以你隨機選擇n位置從1均勻分佈最多N-1(達不到N)。

這裏有一個辦法:

  1. 選擇n不同的隨機位置從1N-1,並對其進行排序。調用產生的位置向量pos。這可以通過randpermsort輕鬆完成。
  2. 對於pos中的每個值,比如p,將r(p)累加爲r(p+1),並將r(p)設置爲零。這是通過for循環完成的。

在步驟2中,如果位置p+1恰好屬於pos太,累計值將被進一步在後續迭代中向右移動。這是有效的,因爲pos已經排序,所以隨機選擇的位置從左到右進行處理。

r = [3 5 4 3 7 2 8]; %// data 
n = 2; %// number of positions 
pos = sort(randperm(numel(r)-1,n)); %// randomly select positions, and sort them 
for p = pos 
    r([p p+1]) = [0 r(p)+r(p+1)]; %// process position p 
end 
+1

'randsample'需要統計工具箱。對於香草MATLAB採樣,你可以使用'idx = zeros(n,1);而長度(unique(idx)) excaza

+0

@excaza ...或者你可以使用'randperm':'pos = randperm(numel(r)-1,n)'。好主意,謝謝!我會改變這一點,以避免統計工具箱 –

+0

哎呀,嗯,這是一個更乾淨的選項 – excaza

1

假設N,n和r都已經產生,那麼我們選擇隨機指標:

inds = randi(N,n,1); 

然後實現可以循環所期望的結果如下:

inds = sort(inds); 

for ii=1:numel(inds) 
    if(inds(ii)<N) 
     r(inds(ii)+1)=r(inds(ii)+1) +r(inds(ii)); 
     r(inds)=0; 
    else 
     r(inds)=0; 
    end 
end 

這將創建添加值到未被選擇將被設置爲0。

注下一個索引的所期望的結果,我不得不承擔的邊緣的情況下,如果最後一個索引被設置爲0,則第v alue不會添加到任何東西。

+0

如果'randi'多次返回相同的整數會發生什麼? – excaza

+0

結果與僅使用所選索引的唯一子集的情況相同。問題的主要觀點似乎是對向量的期望更改,而不是關於生成唯一值的問題,因爲問題實際上並沒有聲明隨機索引必須是唯一的 – Tar