方阵排列

时间:2010-12-10 16:49:20

标签: c algorithm matrix

我有一组大小为N的项目。这些项目按概率排序。在C样式记忆组织中,这些项目的方阵m [N] [N]将具有展开相似概率的元素。例如,m [0] [100]将远离m [100] [0],并且所有其他概率相似。我需要以一种简单的方式排列元素,因此更可能的是更接近于0.它不需要是方形矩阵,它可以是向量[N * N]。并且它不需要是完美的,只要具有相似概率的元素在某种程度上组合在一起就足够了。

我正在寻找函数f(i,j)来给出置换矩阵/向量的位置。如果可能的话,操作非常简单(例如没有正方形和除法,但程序条件可以正常)

有关更多图形参考,我正在寻找类似的东西。 [来自英国广播公司的关于康托尔论证的数学故事] alt text

但它并不需要完全相同的排列。只是走在对角线上的元素大部分都在附近。

嗯,我知道这可能是非常简单的事情,但是自从学校/大学和Wolframalpha没有帮助以来已经很多年了。

谢谢!

1 个答案:

答案 0 :(得分:3)

您的问题有点不清楚,但是通过图形,您需要一个描述该路径映射的函数,例如f(1,2)= 8。

i + j给出对角线的索引,称之为d。在该对角线的对角线上有(d + 1)d / 2个元素。如果d是偶数,我们正在向右计数,如果它是奇数我们向下计数到左边,所以我们在对角线中计算的元素数分别是j + 1或i + 1: / p>

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);
}

修改:
我觉得自己很傻。
上面的函数适用于d< = N,但不适用于d> N(矩阵的右下半部分)。

首先要做的事情。出于某种原因,我开始将索引设置为1而不是0,因此f(0,0)= 1,这实际上并不一致。因此,如果您不介意我将删除+1,那么f(0,0)=0。现在来处理右下半部分,

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);
}