排列的数据转换
Data transformation for permutation
我有一个方阵 MxN,元素为 xij。每个值都用于 some_function(i,j) 形式的函数。
该函数按列顺序应用。我想要实现的是一个内核函数 k(i, j) ,它将被放置在 some_function:
def some_function(i, j):
i', j' = k(i, j)
我将return另一组(i', j') 使(i'!=i, j'!=j) 和(i', j') 对应于初始方阵。应用于每个值 (i,j) 的函数不会产生任何重复的对。核函数 (i',j') 产生的数字应该是分布式的。
我的第一个想法是预先计算另一个列表中的排列并将该值传递给 some_function。我想知道是否有更好的方法来做到这一点。谢谢你。
将 MxN 矩阵视为长度为 M*N 的一维数组。您想要创建一个转换,将 0..MN-1 范围内的每个数字唯一地映射到该范围内的另一个数字(并在 MN 步骤 returns 之后映射到初始索引)。
实现此目标的最简单方法是使大小为 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 每次都会改变。
我有一个方阵 MxN,元素为 xij。每个值都用于 some_function(i,j) 形式的函数。 该函数按列顺序应用。我想要实现的是一个内核函数 k(i, j) ,它将被放置在 some_function:
def some_function(i, j):
i', j' = k(i, j)
我将return另一组(i', j') 使(i'!=i, j'!=j) 和(i', j') 对应于初始方阵。应用于每个值 (i,j) 的函数不会产生任何重复的对。核函数 (i',j') 产生的数字应该是分布式的。
我的第一个想法是预先计算另一个列表中的排列并将该值传递给 some_function。我想知道是否有更好的方法来做到这一点。谢谢你。将 MxN 矩阵视为长度为 M*N 的一维数组。您想要创建一个转换,将 0..MN-1 范围内的每个数字唯一地映射到该范围内的另一个数字(并在 MN 步骤 returns 之后映射到初始索引)。
实现此目标的最简单方法是使大小为 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 每次都会改变。