我有一组N号的项目。这些项目是按概率排序的在C风格的存储组织中,这些项的平方矩阵m[N][N]将具有类似的概率分布的元素例如,m[0][100]将非常远离m[100][0]和具有类似概率的所有其他值我需要用一种简单的方式排列元素,这样更可能接近于0它不需要是平方矩阵,它可以是向量[N*N]它不需要是完美的,只要足够好,具有相似概率的元素就可以被组合在一起。
我在寻找一个函数f(I,j)来给出置换矩阵/向量上的位置如果可能的话,使用非常简单的操作(例如没有平方和除法,但是编程条件是可以的)
为了获得更多的图形参考,我正在寻找类似的东西[摘自英国广播公司的数学故事,关于坎托的论点]
但它不一定是那种排列。只是走在对角线上的元素大多集中在附近。
嗯,我知道这可能很简单,但学校/大学和沃尔夫拉梅尔法已经很多年没有帮助了。
谢谢!

最佳答案

您的问题有点不清楚,但是根据图形,您需要一个描述该路径映射的函数,例如f(1,2)=8。
i+j给出了对角线的索引,称之为d。在对角线上有(d+1)d/2个元素。如果d是偶数,我们向上计数,向右计数,如果是奇数,我们向下计数,向左计数,所以我们在对角线中计数的元素数分别是j+1或i+1:

unsigned int f(unsigned int i, unsigned int j)
{
  unsigned int d = i+j;
  unsigned int k = (d+1)*d/2 + (d%2 ? i : j) + 1;
  return(k);
}

编辑:
我觉得自己像个傻瓜上面的函数适用于dN(矩阵的右下半部分)。
第一件事。出于某种原因,我将索引从0改为1,因此f(0,0)=1,这并不完全一致。如果你不介意的话,我会把它去掉。现在来处理右下半部分,
unsigned int f(unsigned int i, unsigned int j, unsigned int N)
{
  unsigned int d = i+j;
  if(d>=N)
    return(N*N - f(N-1-i, N-1-j, N) - 1);
  unsigned int k = (d+1)*d/2 + (d%2 ? i : j);
  return(k);
}

关于c - 方阵置换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4411231/

10-11 15:25