2012-11-18 51 views
3

我需要在Matlab中實現以下算法。Matlab:如何隨機置換和逆置換矢量

  1. 假設A = [3 4 1 9 5]
  2. 置換A隨機說,A = [5 1 4 3 9]
  3. 添加2〜前兩個元素:A = [7 3 4 3 9]
  4. 置換一回,A = [3 4 3 9 7]

我使用randperm()功能置換:

index = randperm(numel(A)); 
A = A(index); 

但問題是如何將排列A更改爲第一個排列後將其置換回來。

回答

9

實際上你可以放索引的左側:

A(index) = A; 

;-)

+0

啊!這很簡單。謝謝。它的運作良好 –

+0

爲什麼這樣工作? –

3

試試這個

index = randperm(numel(A)); 
nums=1:length(A) 
return_index=nums(index) 
temp = A(index); 
temp(1:2)=temp(1:2)+2; 
A(nums)=temp(return_index); 
+0

是啊!它的工作。謝謝你的回覆 –

+0

你知道'nums(index)'和'index'完全一樣(因爲nums = 1:length(A)')對嗎?就像「A(nums)」與「A」本身一樣。這似乎過於複雜:s –

4

因此,基本上,你只是想添加2比2矢量A的隨機元素。無需排列,只需選取兩個隨機索引即可。在最新版本的MATLAB randperm的兩個參數:

p = randperm(n,k)返回包含隨機選擇的從1到n包容k唯一整數的行向量。

,那麼你可以使用:

idx = randperm(numel(A),2); 
A(idx)=A(idx) + 2; 

在舊版本中,你可以使用:

idx = randperm(numel(A)); 
idx = idx(1:2); 
A(idx)=A(idx) + 2; 
+0

啊!這個也是。 Matlab簡直太棒了 –