矩阵的常规压缩存储

SparseMatrix.h#ifndef _SPARSEMATRIX_H#define _SPARSEMATRIX_H#include<stdio.h>#include<memory.h>#include<stdlib.h>#include<assert.h>#define ElemType int#define MAXSI...
摘要由CSDN通过智能技术生成

SparseMatrix.h

#ifndef _SPARSEMATRIX_H
#define _SPARSEMATRIX_H

#include<stdio.h>
#include<memory.h>
#include<stdlib.h>
#include<assert.h>

#define ElemType int
#define MAXSIZE 100

typedef struct Triple
{
	int i;
	int j;
	ElemType e;
}Triple;

typedef struct SMatrix
{
	Triple data[MAXSIZE]; // 0
	int mu;
	int nu;
	int tu;
}SMatrix;

///
void CreateMatrix(SMatrix *M);
void PrintMatrix(SMatrix *M);
void CopyMatrix(SMatrix *M, SMatrix *T);
void AddMatrix(SMatrix *M, SMatrix *N, SMatrix *T); //M N
void SubMatrix(SMatrix *M, SMatrix *N, SMatrix *T);
void MulMatrix(SMatrix *M, SMatrix *N, SMatrix *T); //M (m,n) N(x,y)
void TransposeMatrix(SMatrix *M, SMatrix *T);
void FastTransposeMatrix(SMatrix *M, SMatrix *T);

#endif

 SparseMatrix.cpp

#include"SparseMatrix.h"

void CreateMatrix(SMatrix *M)
{
	FILE *fp = fopen("Matrix.txt","r");
	if(fp == NULL)
		exit(1);

	fscanf(fp,"%d %d",&M->mu, &M->nu);

	int value;
	int k = 0;
	for(int i=0; i<M->mu; ++i)
	{
		for(int j=0; j<M->nu; ++j)
		{
			fscanf(fp,"%d",&value);
			if(value != 0)
			{
				M->data[k].e = value;
				M->data[k].i = i;
				M->data[k].j = j;
				k++;
			}
		}
	}
	M->tu = k;
	fclose(fp);
}

void PrintMatrix(SMatrix *M)
{
	printf("row=%d, col=%d\n",M->mu,M->nu);
	for(int i=0; i<M->tu; ++i)
	{
		printf("(%d, %d, %d)\n",M->data[i].i,M->data[i].j,M->data[i].e);
	}
}

void CopyMatrix(SMatrix *M, SMatrix *T)
{
	T->mu = M->mu;
	T->nu = M->nu;
	T->tu = M->tu;

	for(int i=0; i<M->tu; i++)
	{
		T->data[i].i = M->data[i].i;
		T->data[i].j = M->data[i].j;
		T->data[i].e = M->data[i].e;
	}
}

void TransposeMatrix(SMatrix *M, SMatrix *T)
{
	T->mu = M->nu;
	T->nu = M->mu;
	T->tu = M->tu;

	int q = 0;
	if(M->tu != 0)
	{
		for(int col=0; col<M->nu; ++col)
		{
			for(int p=0; p<M->tu; ++p)
			{
				if(M->data[p].j == col)
				{
					T->data[q].i = M->data[p].j;
					T->data[q].j = M->data[p].i;
					T->data[q].e = M->data[p].e;
					q++;
				}
			}
		}
	}
}

void FastTransposeMatrix(SMatrix *M, SMatrix *T)
{
	T->mu = M->nu;
	T->nu = M->mu;
	T->tu = M->tu;

	int *num = (int *)malloc(sizeof(int) * M->nu);
	assert(num != NULL);
	int *cpot = (int*)malloc(sizeof(int) * M->nu);
	assert(cpot != NULL);

	if(T->tu != 0)
	{
		for(int col=0; col<M->nu; ++col)
		{
			num[col] = 0;
		}
		for(int t=0; t<M->tu; ++t)
		{
			num[M->data[t].j]++;
		}
		cpot[0] = 0;
		for(col=1; col<M->nu; ++col)
		{
			cpot[col] = cpot[col-1] + num[col-1];
		}

		int q = 0;
		for(int p=0; p<M->tu; ++p)
		{
			col = M->data[p].j;
			q = cpot[col];
			T->data[q].i = M->data[p].j;
			T->data[q].j = M->data[p].i;
			T->data[q].e = M->data[p].e;
			cpot[col]++;
		}
	}
	free(num);
	free(cpot);
}

Main.cpp

#include"SparseMatrix.h"

void main()
{
	SMatrix sm, sm1;
	memset(&sm, 0, sizeof(sm));
	CreateMatrix(&sm);
	PrintMatrix(&sm);

	//TransposeMatrix(&sm, &sm1);
	//CopyMatrix(&sm, &sm1);
	FastTransposeMatrix(&sm, &sm1);
	PrintMatrix(&sm1);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值