【问题标题】:Mapping elements in 2D upper triangle and lower triangle to linear structure将二维上三角形和下三角形中的元素映射到线性结构
【发布时间】:2011-06-15 17:57:06
【问题描述】:

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

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

的公式

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

0123
X456
XX78
XXX9

这是一个 7x7 矩阵,索引为 K 线性数组

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

【问题讨论】:

  • 三角矩阵的元素个数不是N²/2,而是(N²+N)/2。

标签: c++ arrays algorithm matrix indexing


【解决方案1】:

假设 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 个元素空间。

【讨论】:

  • 这个公式不正确。作者要求的是上三角矩阵,而不是下三角矩阵。
  • @ViktorFonic 最后一句给出了上三角形的公式。将“If x>y”读作“If you need the upper triangle”。
【解决方案2】:

朝着相反的方向前进,这正是我所需要的:

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

【讨论】:

  • 谢谢你,这正是我所需要的。 GPU 上的性能比我想出的要好得多:int c = element; int r = 0; while (c - (r+1) >= 0) { r++; c -= r; }
【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2014-07-08
    相关资源
    最近更新 更多