我有一个方阵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。我想知道是否有更好的方法来做到这一点。谢谢。答案 0 :(得分: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每次都会改变。