Multiplicación de matriz dispersa

Multiplicación de matriz dispersa

Información del tema

La compresión de datos es una técnica para mejorar la eficiencia de transmisión y almacenamiento.
Este experimento requiere la realización de un algoritmo para el producto de dos matrices dispersas. El número de elementos distintos de cero en la matriz dispersa es menor que 100.

entrar

El número de filas, columnas y el número de elementos distintos de cero de la primera matriz dispersa (los tres números son mayores que 0), el
número de filas, columnas y el número de elementos distintos de cero de la segunda matriz dispersa del triplete (tres números Son mayores que 0), los triples se
ingresan en la tabla de tripletes de matriz dispersa en la secuencia principal de filas

Salida

El número de
filas y columnas de la matriz del producto El número de
elementos distintos de cero (los tres números son mayores que 0) se
triplica

Muestra de prueba

3
4
4
1 1 3
1 4 5
2 2 -1
3 1 2
4
2
4
1 2 2
2 1 1
3 1 -2
3 2 4
3
2
3
1,2,6
2,1,-1
3,2,4

responder

#include<stdio.h>

typedef struct
{
    
    
    int i, j;
    int e;
} Node;
typedef struct
{
    
    
    Node nodes[105];
    int rpos[105];//各行第一个非零元的位置表
    int m, n, t;
} Matrix;

int main()
{
    
    
    //freopen("/Users/zhj/Downloads/test.txt", "r", stdin);
    Matrix A, B;

    scanf("%d%d%d", &A.m, &A.n, &A.t);
    for (int i = 1; i <= A.t; i++)
    {
    
    
        scanf("%d%d%d", &A.nodes[i].i, &A.nodes[i].j, &A.nodes[i].e);
    }
    int num[1000];
    for (int col = 1; col <= A.m; col++)
    {
    
    
        num[col] = 0;
    }
    for (int i = 1; i <= A.t; i++)
    {
    
    
        num[A.nodes[i].i]++;
    }
    A.rpos[1] = 1;
    for (int col = 2; col <= A.m; col++)
    {
    
    
        A.rpos[col] = A.rpos[col - 1] + num[col - 1];
    }

    scanf("%d%d%d", &B.m, &B.n, &B.t);
    for (int i = 1; i <= B.t; i++)
    {
    
    
        scanf("%d%d%d", &B.nodes[i].i, &B.nodes[i].j, &B.nodes[i].e);
    }
    for (int col = 1; col <= B.m; col++)
    {
    
    
        num[col] = 0;
    }
    for (int i = 1; i <= B.t; i++)
    {
    
    
        num[B.nodes[i].i]++;
    }
    B.rpos[1] = 1;
    for (int col = 2; col <= B.m; col++)
    {
    
    
        B.rpos[col] = B.rpos[col - 1] + num[col - 1];
    }

    Matrix Q;
    Q.m = A.m;
    Q.n = B.n;
    Q.t = 0;//创建答案矩阵

    if (A.t * B.t != 0)
    {
    
    //Q是非零矩阵
        for (int arow = 1; arow <= A.m; arow++)
        {
    
    //处理A的每一行
            int ctemp[105] = {
    
    0};
            Q.rpos[arow] = Q.t + 1;

            int tp;//tp是下一行元素在nodes表中位置
            if (arow < A.m)
            {
    
    
                tp = A.rpos[arow + 1];
            }
            else
            {
    
    
                tp = A.t + 1;
            }
            for (int p = A.rpos[arow]; p < tp; p++)
            {
    
    //对当前行中每一个非零元,既从当前在nodes表中位置找到下一行元素在nodes表的位置
                int brow = A.nodes[p].j;//此为A表中的纵向位置值,在B表中找相应的行号即可

                int t;//t仍然为下一行的位置
                if (brow < B.m)
                {
    
    
                    t = B.rpos[brow + 1];
                }
                else
                {
    
    
                    t = B.t + 1;
                }
                for (int q = B.rpos[brow]; q < t; q++)
                {
    
    
                    int ccol = B.nodes[q].j;//Q中的纵坐标是以B元素中的j来说话的
                    ctemp[ccol] += A.nodes[p].e * B.nodes[q].e;
                }
            }

            for (int ccol = 1; ccol <= Q.n; ccol++)
            {
    
    //压缩存储该行的非零元
                if (ctemp[ccol])
                {
    
    //如果此处有值的话
                    Q.t++;//Q的非零元素多了一个
                    Q.nodes[Q.t].i = arow;//行号为此时遍历的A的行号
                    Q.nodes[Q.t].j = ccol;//列号为此时正在进行压缩所遍历到有值的地方
                    Q.nodes[Q.t].e = ctemp[ccol];//累计的和拷贝过来
                }
            }
        }
    }

    printf("%d\n", Q.m);
    printf("%d\n", Q.n);
    printf("%d\n", Q.t);
    for (int i = 1; i <= Q.t; i++)
    {
    
    
        printf("%d,%d,%d\n", Q.nodes[i].i, Q.nodes[i].j, Q.nodes[i].e);
    }
    return 0;
}

idea

Inserte la descripción de la imagen aquí
Para cada elemento en A A.nodes[p](p=1,2,...,A.t), encontrar todos satisfacen la condición N A.nodes[p].j = B.nodes.ielementos B.nodes[q], se obtiene A.nodes[p].v, y B.nodes[q].vel producto. El
valor de cada elemento de la matriz del producto Q se acumula y este producto A.nodes[p].v * B.nodes[q], v es sólo Q[i][j]una parte de. Para facilitar la operación, cada afrontamiento Establezca una variable de suma acumulativa para cada elemento, y su valor inicial sea cero, y luego barra la matriz A para encontrar el producto del elemento correspondiente y agréguelo a la variable de suma acumulada apropiada

Supongo que te gusta

Origin blog.csdn.net/zhj12399/article/details/109332227
Recomendado
Clasificación