将2D上三角和下三角中的元素映射到线性结构

时间:2011-01-26 09:52:51

标签: c++ arrays algorithm matrix indexing

我有一个NxN维的矩阵M,其中M(i,j)= M(j,i)

我想将此结构表示为(N²+ N)/ 2线性阵列K,以节省空间。我的问题出现了将M(min(i,j),min(i,j))映射到范围[0,(N ^ 2)/ 2)的公式

下面是3 x3矩阵与K线性数组索引的映射,X表示这些单元格不存在,而是使用它们的转置:

0123
X456
XX78
XXX9

这是一个带有K线性阵列索引的7x7矩阵

     0  1  2  3  4  5  6
 0  00 01 02 03 04 05 06
 1     07 08 09 10 11 12
 2        13 14 15 16 17
 3           18 19 20 21
 4              22 23 24
 5                 25 26
 6                    27

目前我有以下

int main()
{
   const unsigned int N = 10;
   int M[N][N];

   int* M_ = &(M[0][0]);

   assert(M[i][j] = M_[N * min(i,j) + max(i,j)]);

   //int* K = .....
   //assert(M[i][j] = K[.....]);

   return 0;
}

3 个答案:

答案 0 :(得分:12)

走向我需要的相反方向:

void printxy(int index)  
{  
    int y = (int)((-1+sqrt(8*index+1))/2);  
    int x = index - y*(y+1)/2;  
}

答案 1 :(得分:9)

假设y> = x,您可以使用像

这样的“映射”
index := x + (y+1)*y/2

会产生

 0

 1   2

 3   4   5

 6   7   8   9

10  11  12  13  14

如果x> y,则只需交换x和y。你需要(size + 1)* size / 2个元素空间。

答案 2 :(得分:-3)

这里有正确的映射:

        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                    int idx = sum(n) - sum(n - i) + j - i;
            }
        }

其中sum(x) = x * (x + 1) / 2;