2016-03-03 31 views
1

我有一個方形矩陣MxN,元素爲x ij。每個這些值都被用於some_function(i,j)形式的函數中。 該功能按列順序應用。我想實現的是一個內核函數K(I,J)將放置內some_function:用於置換的數據轉換

def some_function(i, j): 
    i', j' = k(i, j) 

我將返回另一組(I」,J '),這樣(I'= I, j'!= j)和(i',j')對應於初始方形矩陣上的實數值。這個函數應用於每個值(i,j)都不會產生任何重複對。核函數(i',j')產生的數字應該是分佈的。

我的第一個想法是預先計算另一個列表中的排列並將該值傳遞給some_function。我想知道是否有更好的方法來做到這一點。謝謝。

回答

1

將MxN矩陣看作長度爲M * N的一維數組。您希望創建一個轉換,它將0..MN-1範圍內的每個數字唯一映射到此範圍內的另一個數字(並且在MN步驟返回到初始索引後)。

實現這一目標的最簡單方法就是讓大小P是與M和N小於M 實例互爲素和大的步驟:

indx = M * i + j /start cell 
for k = 0.. M*N - 1 do begin 
    indx = (indx + P) % (M*N) //integer modulus 
    i = indx/M //integer division 
    j = indx % M //integer modulus 
end // indx returns to the start value 

for M=2,N=4, P=5 
indx i j 
0  0 0 
5  2 1 
2  1 0 
7  3 1 
4  2 0 
1  0 1 
6  3 0 
3  1 1 

注意,這兩個i和j的每一次變化。