Создать разреженную матрицу, в которой хранятся только индексы строк и столбцов матрицы, используя C - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть (2 x 4) двоичная матрица A, и я хочу заменить эту матрицу на (2 * шкала x 4 * шкала) двоичной матрицы B, так что элемент 1 в матрице A заменяется на (шкала x шкала)единичная матрица и элемент 0 заменяется нулевой матрицей (масштаб х).

matrix A:
1 0 1 0
0 1 0 0

matrix B:
1 0 0 0 1 0 0 0
0 1 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0

Однако мне нужно только положение 1 в матрице B, поэтому я создаю разреженную матрицу, которая хранит только строку ииндексы столбца матрицы B.

0, 0
0, 4
1, 1
1, 5
2, 2
3, 3

Я делаю это в 2 этапа для приведенного ниже примера кода: (1) создать матрицу B (2) создать разреженную структуру.Это пример кода, где макросы определены только для этого примера. В общем, я работаю с огромными матрицами порядка 10000 x 10000 или более.

Я хочу избежать шага 1 (т. Е. Создания матрицы B) инепосредственно создайте разреженную структуру для хранения индексов строк и столбцов.Может ли кто-нибудь помочь мне с этим?

#include <stdio.h>

#define rowSize         2       //!< row size of matrixA
#define colSize         4       //!< column size of matrixA
#define scalingFactor   2       //!< scaling factor to increase the size of matrixA
#define nonZeros        3       //!< number of 1's in matrixA

//!< struct to hold the position of 1's in matrixB
typedef struct sparseMatrix{
    int row;
    int col;
}sparseMatrix;

int main()
{
    int row, col, idx;
    int matrixA[rowSize][colSize] = {{1,0,1,0},{0,1,0,0}};
    int matrixB[rowSize*scalingFactor][colSize*scalingFactor] = {{0}};
    sparseMatrix matrixC[nonZeros*scalingFactor];

    // check for the element 1 in matrixA and replace it with an identity matrix of size 'scalingFactor'
    for(row = 0; row < rowSize; row++){
        for(col = 0; col < colSize; col++){
            if(matrixA[row][col] == 1){
                for (idx = 0; idx < scalingFactor; idx++){
                    matrixB[(scalingFactor) * row + idx][(scalingFactor) * col + idx ] = 1; // matrixB created
                }
            }
        }
    }

    // create a sparse matrix that stores only position of 1's in matrixB
    idx = 0;
    for(row = 0; row < rowSize*scalingFactor; row++){
        for(col = 0; col < colSize*scalingFactor; col++){
            if(matrixB[row][col] == 1){
                matrixC[idx].row = row;
                matrixC[idx].col = col;
                idx++;
            }
        }
    }


    // print the sparse matrix
    for(idx = 0; idx < nonZeros*scalingFactor; idx++){
            printf("%d, %d\n",matrixC[idx].row, matrixC[idx].col);
    }

    return 0;
}

1 Ответ

0 голосов
/ 21 декабря 2018

Полагаю, вы можете интегрировать свой второй for цикл в первый.Поэтому вместо создания матрицы B вы бы непосредственно сохранили ее индексы:

int i = 0; // variable to save matrixC current index

// check for the element 1 in matrixA and replace it with an identity matrix of size 'scalingFactor'
for (row = 0; row < rowSize; row++) {
    for (idx = 0; idx < scalingFactor; idx++) {
        for (col = 0; col < colSize; col++) {
            if (matrixA[row][col] == 1) {
                // instead of creating a temporary dense matrix,
                // just save its indexes:
                matrixD[i].row = row * scalingFactor + idx;
                matrixD[i].col = col * scalingFactor + idx;
                i++;
            }
        }
    }
}
...