稀疏矩阵的压缩行存储格式

时间:2014-07-27 03:27:58

标签: c sparse-matrix

我正在编写一个程序,将稀疏矩阵转换为阻塞压缩行存储BCRS

我知道如何获得Rowptr,Colind(虽然不在代码中)和A_f。

代码:

    p = 0;
    for (i = 0; i < m; i++) {
        row_ptr[++p] = (row_ptr[p - 1] + count_blocks(A, i, n));
        for (j = 0; j < n; j++) {
            if (A[i][j]) {
                A_f[k] = A[i][j];
                k++;
            }
        }
    }

我上面使用的函数返回一行中的块数:

int count_blocks(int matrix[100][100], int row_idx, int n) {
int i;
int block_count = 0;

for (i = 0; i < n - 1; i++) {
    if (matrix[row_idx][i]) { 
        if (!matrix[row_idx][i + 1])
            block_count++;
        else if (matrix[row_idx][i + 1] && i == n - 2)
            block_count++;
    }
    else if (!matrix[row_idx][i] && i == n - 2) {
        if (matrix[row_idx][i + 1])
            block_count++;
        break;
    }
}
return block_count;

但是我被困在收购Nzptr。我该如何计算?

代码有点多余,我知道。

谢谢:)

1 个答案:

答案 0 :(得分:0)

这是一个在给定大小为5x5的矩阵的情况下计算nzptr的函数。它返回nzptr中的项目数。它还使用C样式索引计算索引。

int computeNzptr(double matrix[5][5], int nzptr[])
{
   int isNewBlock = 1;
   int nzIndex = 0;
   int nonZeroCount = 0;
   int i = 0;
   int j = 0;
   for ( i = 0; i < 5; ++i )
   {
      for ( j = 0; j < 5; ++j )
      {
         if ( matrix[i][j] != 0.0 )
         {
            ++nonZeroCount;
            if ( isNewBlock )
            {
               isNewBlock = 0;
               nzptr[nzIndex++] = nonZeroCount-1;
            }
         }
         else
         {
            isNewBlock = 1;
         }
      }
   }
   return nzIndex;
}

<强> PS

在参考图像中,描述和答案不匹配。如果您有一个5x5矩阵,它与发布图像中的矩阵相同,

double matrix[5][5] =
{
   {5.0, 1.0, 7.0, 0.0, 0.0},
   {0.0, 1.0, 0.0, 2.0, 3.0},
   {0.0, 2.0, 4.0, 0.0, 0.0},
   {0.0, 0.0, 1.0, 3.0, 0.0},
   {0.0, 6.0, 0.0, 0.0, 3.0}
};

根据描述输出应为:

0 3 4 6 8 10 11

这与参考文献中的输出不同。

我假设参考文档中的描述正确且输出不正确。