我正在编写一个程序,将稀疏矩阵转换为阻塞压缩行存储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。我该如何计算?
代码有点多余,我知道。
谢谢:)
答案 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
这与参考文献中的输出不同。
我假设参考文档中的描述正确且输出不正确。