У меня есть (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;
}