Transposición en columna de matriz dispersa usando tripletes

Contenido: escribir un programa para implementar la operación de transposición por columnas de una matriz dispersa con triples

 

paso:

Análisis de Algoritmos:

Primero comprenda el concepto de matriz dispersa: suponga que hay t elementos distintos de cero en la matriz m*n y t<<m*n, tal matriz se llama matriz dispersa. Se puede ver a partir de esto que habrá una gran cantidad de elementos cero en la matriz dispersa. Si todavía se asigna de acuerdo con el método convencional, será una pérdida de memoria, especialmente en muchos cálculos de ingeniería y administración científica, que a menudo encuentran matriz dispersa grande de muy alto orden. Con este fin, se propone un nuevo método de almacenamiento: solo se almacenan elementos distintos de cero. La fila, la columna y su valor del elemento distinto de cero forman un triplete (i, j, v), y luego almacenan el triplete de acuerdo con una determinada regla.

La llamada transposición de matriz se refiere a transformar la posición del elemento, convirtiendo el elemento en la posición (fila, columna) a la posición (columna, fila), es decir, intercambiar la fila y la columna del elemento.

Hay tres funciones diseñadas en el programa:

① La función InitSPNode() se usa para crear una tabla de tripletes de una matriz dispersa.

Primero ingrese el número de filas, columnas y valores de elementos distintos de cero, e ingrese (-1,-1,-1) para finalizar la entrada.

②La función showMatrix() se usa para generar la matriz dispersa.

En el algoritmo, la columna de la matriz a se procesa cíclicamente y el triplete se escanea para cada columna de a para encontrar el elemento correspondiente. Si se encuentra, su número de fila y número de columna se intercambian y almacenan en el triplete de la matriz b.

③La función TransposeSMatrix() se usa para completar el algoritmo de transposición de la matriz dispersa.

    El trabajo principal del algoritmo se completa en el doble ciclo de p y col, y la complejidad temporal es O(n*t). Si el número de elementos distintos de cero t es del mismo orden de magnitud que m*n, la complejidad temporal del algoritmo se convierte en O(m*n^2).

Diseño del esquema:

Función InitSPNode()

Construya una lista de triples de una matriz dispersa

función mostrarMatriz()

matriz dispersa de salida

Función TransposeSMatrix()

Complete el algoritmo de transposición de matriz dispersa

Diagrama de flujo del programa:

 

 

el código se muestra a continuación:

#include <stdio.h>
#include <string.h>
#define OK 1
#define Maxsize 10
typedef struct//定义三元组表 
{
	int i,j;//非零元素的行、列 
	int v;//非零元素的值 
 } SPNode;
 typedef struct
 {
 	SPNode data[Maxsize];
 	int m,n,t;//矩阵的行、列、非零元素的个数 
 }SPMatrix;
 void InitSPNode(SPMatrix *a)//输入 
 {
 	int i,j,val,row,col;//行、列、值、当前最大行、最大列
 	int k;
	row=0;col=0;
	i=j=0;
	k=0; 
	while(i!=-1&&j!=-1)
	{
		printf(" 输入(行、列、值)");
		scanf("%d %d %d",&i,&j,&val);
		a->data[k].i=i;
		a->data[k].j=j;
		a->data[k].v=val;
		if(row<i) row=i;
		if(col<j) col=j;
		k++;
	}
	a->m=row;
	a->n=col;
	a->t=k-1;
  } 
  void showMatrix(SPMatrix *a)//输出 
  {
  	int p,q;
  	int t=0;
	for(p=0;p<=a->m;p++)
	{
		for(q=0;q<=a->n;q++)
		{
			if(a->data[t].i==p&&a->data[t].j==q)
			{
				printf("%d  ",a->data[t].v);
				t++;
			 } 
			 else
			 printf("0  ");
		}
		printf("\n");
	}
  }
  void TransposeSMatrix(SPMatrix *a,SPMatrix *b)//转置
  {
  	int q,col,p;
  	b->m=a->n;
  	b->n=a->m;
  	b->t=a->t;
  	if(b->t)
  	{
  		q=0;
  		for(col=0;col<=a->n;++col)
  		for(p=0;p<a->t;++p)
  		if(a->data[p].j==col)
  		{
  			b->data[q].i=a->data[p].j;
  			b->data[q].j=a->data[p].i;
  			b->data[q].v=a->data[p].v;
  			++q;
		  }
	  }
	 
  }
  void main()
  {
  	SPMatrix a,b;
  	printf("\n 结束请输入(-1 -1 -1)\n");
	InitSPNode(&a);
	printf(" 输入矩阵为:\n");
	showMatrix(&a);//转置前 
	TransposeSMatrix(&a,&b);
	printf(" 输出矩阵为:\n");
	showMatrix(&b);//转置后 
  }

resultado de la operación:

 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_54474126/article/details/121751653
Recomendado
Clasificación