4.3稀疏矩阵的运算与实现

<span style="font-size:32px;">//iOS学习交流群:230644538</span>
#include <stdio.h>
#include <string.h>
using namespace std;

#define OK 1
#define MAX 10//用户自定义三元组的最大长度

//定义三元组表
typedef struct
{
	int i, j;//非零元素的行下标和列下标
	int v; //非零元素的值
}TriTupleNode;

typedef struct
{
	TriTupleNode data[MAX];   //非零元素三元组表
	int m;   //矩阵行数
	int n;   //矩阵列数
	int t;   //三元组表长度(非零元素个数)
}TSMatrix;

/****-----------------------------------------------------------------****/
//函数名:  InitTriTupleNode(TSMtrix *a)
//参数:    (传入)TSMatrix *a 稀疏矩阵指针
//作用:    建立稀疏矩阵的三元组表
/****-----------------------------------------------------------------****/
void InitTriTupleNode(TSMatrix *a)
{
    int i, j, k, val, maxrow, maxcol;
    maxrow = 0;
    maxcol = 0;
    k = 1;
    while(i != -1 && j != -1) { /*row = -1 && col = -1结束输入*/
        printf("input row col val:");
        scanf("%d %d %d", &i, &j, &val);

        //存储非零元素的位置和值
        a->data[k].i = i;
        a->data[k].j = j;
        a->data[k].v = val;
        if(maxrow < i) maxrow = i;
        if(maxcol < j) maxcol = j;
        k++;
    }
    //设置矩阵a的行列参数以及非零元素个数
    a->m = maxrow;
    a->n = maxcol;
    a->t = k;
}

/****---------------------------------------------*****/
//函数名: ShowMatrix(TSMatrix *a)
//参数:   (传入)TSMatrix *a稀疏矩阵指针
//作用:   输出稀疏矩阵
/****---------------------------------------------*****/
void ShowMatrix(TSMatrix *a)
{
    int p, q;
    int t = 1;
    for(p = 1; p <= a->m; p++) {
        for(q = 1; 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  "); //否则打印输出0
            }
        }
        printf("\n");
    }//for
}

/****---------------------------------------------------*****/
//函数名:  TransposeSMatrix(TSMatrix &a, TSMatrix *b)
//参数:    (传入)TSMatrix *a, *b,稀疏矩阵a,转置矩阵b
//作用:    转置稀疏矩阵
/****---------------------------------------------------*****/

void TransposeSMatrix(TSMatrix *a, TSMatrix *b)
{
    int q, col, p;
    b->m = a->n;
    b->n = a->m;
    b->t = a->t;
    if(b->t) {
        q = 1;
        for(col = 1; col <= a->n; col++) { //从a的第一行开始起扫描
            for(p = 1; p <= a->t; p++) {
                if(a->data[p].j == col) {
                    //将每个三元组中的i和j相互调换
                    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;
                }
            }
        }
    }
}

/**********************测试程序******************************/
int main()
{
    TSMatrix a, b;
    TSMatrix *pa = &a, *pb = &b;
    InitTriTupleNode(pa);
    printf("稀疏矩阵转置前:\n");
    ShowMatrix(pa);
    printf("稀疏矩阵转置后:\n");
    TransposeSMatrix(pa, pb);
    ShowMatrix(pb);
    return 0;
}

时间: 2024-11-08 18:44:29

4.3稀疏矩阵的运算与实现的相关文章

数据结构:稀疏矩阵的简单运算

最近专业课比较多,没怎么看数据结构了.今天有点时间写了一下数据结构中稀疏矩阵的运算.写过之后感觉代码的构思不太好.这里先发一下, 假期的时候再重新实现一下. SpMatrix头文件 1 //The sparse matrix's header file 2 //the class SpMatrix 3 //Author: 'Karllen' 4 //Date:05/28/2014 5 6 #ifndef _SpMatrix_H_ 7 #define _SPMatrix_H_ 8 #include

Matlab矩阵基本操作(定义,运算)

转自:http://blog.csdn.net/perfumekristy/article/details/8119861 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ]”内: b.矩阵的同行元素之间用空格(或”,”)隔开: c.矩阵的行与行之间用”;”(或回车符)隔开: d.矩阵的元素可以是数值.变量.表达式或函数: e.矩阵的尺寸不必预先定义. 二,矩阵的创建: 1.直接输入法 最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,输入的方法按照上面的规则.建立向

数据结构课程设计《稀疏矩阵运算器》

最近正在弄数据结构课程设计内容,说实话,感觉自己数据结构学的就是渣,好多东西都不会.还是要多学点东西啊.现在暂且贴点之前写完的东西吧,到时候也好有个总结. 1 诸论 1.1 问题描述 稀疏矩阵是指那些多数元素为零的矩阵.利用"稀疏"特点进行存储和计算可以大大节省存储空间,提高计算准备效率.实现一个能进行稀疏矩阵基本运算的运算器. 1.2 基本要求 以"带行逻辑链接信息"的三元组顺序表示稀疏矩阵,实现两个稀疏矩阵相加.相减.相乘和求逆的运算.稀疏矩阵的输入形式采用三元

基于稀疏矩阵的k近邻(KNN)实现

一.概述 这里我们先来看看当我们的数据是稀疏时,如何用稀疏矩阵的特性为KNN算法加速.KNN算法在之前的博文中有提到,当时写的测试程序是针对稠密矩阵数据的.但实际上我们也会遇到不少的稀疏数据,而且有很多是有意而为之的,因为稀疏数据具有稠密数据无法媲美的存储和计算特性,这对工程应用中的内存需求和实时需求是很重要的.所以这里我们也来关注下稀疏矩阵的存储和其在knn算法中的应用举例. 大家都知道,所谓稀疏矩阵,就是很多元素为零的矩阵,或者说矩阵中非零元素的个数远远小于矩阵元素的总数,如上图.如果我们只

_DataStructure_C_Impl:稀疏矩阵十字链表存储

#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct OLNode{ int i,j; DataType e; struct OLNode *right,*down; }OLNode,*OLink; typedef struct{ OLink *rowhead,*colhead; int m,n,len; }CrossList; //初始化稀疏矩阵 void InitMatrix(Cros

matlab矩阵的表示和简单操作

原地址:http://www.cnblogs.com/Ran_Ran/archive/2010/12/11/1903070.html 一.矩阵的表示在MATLAB中创建矩阵有以下规则:a.矩阵元素必须在"[ ]"内:b.矩阵的同行元素之间用空格(或",")隔开:c.矩阵的行与行之间用";"(或回车符)隔开:d.矩阵的元素可以是数值.变量.表达式或函数:e.矩阵的尺寸不必预先定义. 二,矩阵的创建:1.直接输入法最简单的建立矩阵的方法是从键盘直接输

Duanxx的Design abroad: C++矩阵运算库Eigen 概要

一.概要 这两天想起来要做神经网络的作业了,要求用C++完毕神经网络的算法. 摆在面前的第一个问题就是,神经网络算法中大量用到了矩阵运算.可是C++不像matlab那样对矩阵运算有非常好的支持.本来准备自己写一个C++的矩阵运算的代码的,google了一下后.找到了几个不错的C++矩阵运算库,我选用的是Eigen这个C++矩阵运算库. Eigen有很丰富的功能: l  支持全部大小的矩阵运算,从非常小的大小固定的矩阵运算.到随意大的稠密矩阵的运算,甚至连稀疏矩阵的运算它也支持. l  支持当前全

MATLAB命令大全和矩阵操作大全

转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在"[ ]"内: b.矩阵的同行元素之间用空格(或",")隔开: c.矩阵的行与行之间用";"(或回车符)隔开: d.矩阵的元素可以是数值.变量.表达式或函数: e.矩阵的尺寸不必预先定义. 二,矩阵的创建: 1.直接输

Duanxx的Design abroad: C++矩阵运算库Eigen 概述

一.概述 这两天想起来要做神经网络的作业了,要求用C++完成神经网络的算法. 摆在面前的第一个问题就是,神经网络算法中大量用到了矩阵运算,但是C++不像matlab那样对矩阵运算有很好的支持,本来准备自己写一个C++的矩阵运算的代码的,google了一下后,找到了几个不错的C++矩阵运算库,我选用的是Eigen这个C++矩阵运算库. Eigen有非常丰富的功能: l  支持所有大小的矩阵运算,从很小的大小固定的矩阵运算,到任意大的稠密矩阵的运算,甚至连稀疏矩阵的运算它也支持. l  支持当前所有