`

稀疏矩阵

 
阅读更多
好久没有写过C#了。不过C#确实非常方便,代码写起来也很顺。这个代码是描述行逻辑链接的三元组顺序表。(处理稀疏矩阵效率要比经典算法高得多的~而且也更节省存储空间。)
//#defineOUTPUT_DEBUG
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace MatrixCSharp
{
    public class Matrix {
 
        public struct PolyEx {
            publicint i;
            publicint j;
            publicint val;
        }
 
        publicMatrix() {
            polyExList = new List<PolyEx>();
            row = col = tu = 0;
        }
 
        publicMatrix(int[,] array)
            :this(){
 
            LoadPolyExList(array);
        }
 
        public void LoadPolyExList(int[,]array) {
            polyExList.Clear();
            row = array.GetLength(0);
            col = array.GetLength(1);
            tu = 0;
 
            for(int i = 0; i < row; ++i)
            {
                for(int j = 0; j < col; ++j)
                {
                    if(array[i, j] != 0)
                    {
                        PolyEx pe = new PolyEx();
                        pe.i = i;
                        pe.j = j;
                        pe.val = array[i, j];
                        polyExList.Add(pe);
                        ++tu;
                    }
                }
            }
 
            firstIndexs = GetFirstIndex(1);
        }
 
        //
        // 1 =>row
        // 0 =>col
        //
        privateint[] GetFirstIndex(intrOrC) {
            // Readall the column numbers.
            intsize = 0;
            if(rOrC == 1){
                size = row;
            }
            else{
                size = col;
            }
            int[]num4Col = new int[size];
            int[]indexs = new int[size];
 
            foreach(PolyEx pe inpolyExList) {
                if(rOrC == 1){
                    num4Col[pe.i]++;
                }
                else{
                    num4Col[pe.j]++;
                }
            }
 
            for(int i = 0; i < size; ++i){
                if(i > 0)
                {
                    indexs[i] += num4Col[i - 1]+ indexs[i - 1];
                }
                else
                {
                    indexs[i] = 0;
                }
            }
 
#if OUTPUT_DEBUG
            Console.WriteLine("FirstIndexs:");
            foreach (int i in indexs) {
                Console.Write(i + "");
            }
            Console.WriteLine();
#endif
 
            returnindexs;
        }
 
        public void Translate() {
            PolyEx[] resList = new PolyEx[tu];
 
            int[]colFirstIndexs = GetFirstIndex(0);
            intindex = -1;
            foreach(PolyEx pe inpolyExList) {
                PolyExpeNew = new PolyEx();
                peNew.j = pe.i;
                peNew.i = pe.j;
                peNew.val = pe.val;
                index = colFirstIndexs[pe.j];
                resList[index] = peNew;
                colFirstIndexs[pe.j]++;
            }
 
            polyExList = new List<PolyEx>(resList);
 
            firstIndexs = colFirstIndexs;
 
            inttemp = row;
            row = col;
            col = row;
        }
 
        public Matrix Mul(Matrixm2) {
            if(this.col != m2.row) {
                returnnull;
            }
 
            MatrixmRes = new Matrix();
 
            // 累加器
            int[] acc = new int[m2.col];
 
            for(int i = 0; i < polyExList.Count; ++i) {
                if(i > 0) {
                    if(polyExList[i].i != polyExList[i - 1].i) {
 
                        for (int j = 0; j < m2.col;++j)
                        {
                            if (acc[j] != 0)
                            {
                                PolyEx pe = new PolyEx();
                                pe.i =polyExList[i].i;
                                pe.j = j;
                                pe.val =acc[j];
                                Console.WriteLine("Col:"+ j + " Val:" + pe.val);
                               mRes.polyExList.Add(pe);
                            }
                        }
                        setZero(acc);
                    }
                }
 
                intcolIndex = m2.firstIndexs[polyExList[i].j];
                while(colIndex < m2.polyExList.Count
                        &&m2.polyExList[colIndex].i == polyExList[i].j) {
#if OUTPUT_DEBUG
                    Console.WriteLine("i=> " + polyExList[i].i);
                    Console.WriteLine("m2j => " + m2.polyExList[colIndex].j);
                    Console.WriteLine();
#endif
                    acc[m2.polyExList[colIndex].j]
                        +=m2.polyExList[colIndex].val * polyExList[i].val;
                    colIndex++;
                }
            }
 
            for(int j = 0; j < m2.col; ++j)
            {
                if(acc[j] != 0)
                {
                    PolyExpe = new PolyEx();
                    pe.i =polyExList[polyExList.Count - 1].i;
                    pe.j = j;
                    pe.val = acc[j];
#if OUTPUT_DEBUG
                   Console.WriteLine("Col:" + j + " Val:" + pe.val);
#endif
                    mRes.polyExList.Add(pe);
                }
            }
 
            mRes.row = row;
            mRes.col = m2.col;
            mRes.firstIndexs = mRes.GetFirstIndex(1);
            mRes.tu = mRes.polyExList.Count;
 
            returnmRes;
        }
 
        privatevoid setZero(int[]array) {
            for(int i = 0; i < array.Length; ++i) {
                array[i] = 0;
            }
        }
 
        public int Row {
            get{ return row; }
        }
 
        public int Col {
            get{ return col; }
        }
 
        public override stringToString()
        {
            StringBuildersb = new StringBuilder();
 
            sb.AppendLine("i\tj\tvalue");
            sb.AppendLine("--\t--\t-----");
            foreach(PolyEx pe inpolyExList) {
                sb.AppendFormat("{0}\t{1}\t{2}\n",
                    pe.i,
                    pe.j,
                    pe.val);
            }
 
            returnsb.ToString();
        }
           
        privateList<PolyEx>polyExList;
        privateint[] firstIndexs;              // 记录每一行非零元的起始位置
        privateint row;
        privateint col;
        privateint tu;
    }
 
    class Program
    {
        static int[,] SimpleMul(int[,]m1, int[,] m2) {
            introw1 = m1.GetLength(0);
            intcol1 = m1.GetLength(1);
            introw2 = m2.GetLength(0);
            intcol2 = m2.GetLength(1);
 
            int[,]mRes = new int[row1,col2];
            for(int i = 0; i < row1; ++i) {
                for(int j = 0; j < col2; ++j) {
                    mRes[i, j] = 0;
                    for(int k = 0; k < col1; ++k) {
                        mRes[i,j] += m1[i,k] *m2[k,j];
                    }
                }
            }
 
            for(int i = 0; i < row1; ++i) {
                for(int j = 0; j < col2; ++j) {
                    if(mRes[i, j] == 0){
                        Console.Write("-\t");
                    }
                    else{
                        Console.Write(mRes[i, j] + "\t");
                    }
                }
                Console.WriteLine();
            }
 
                returnmRes;
        }
 
        static void Main(string[]args)
        {
            int[,]test = {
                { 0, 0, 1, 0, 0, 0, 1, 0, 3,4},
                { 3, 0, 0, 0, 0, 0, 7, 0, 3,4},
                { 0, 4, 9, 0, 0, 5, 1, 0, 3,4},
                { 0, 0, 0, 13, 0, 0, 8, 0, 3, 4},
                { 0, 0, 0, 0, 0, 0, 9, 0, 3,4},
                { 0, 0, 0, 0, 0, 0, 1, 0, 3,4},             
            };
 
            int[,]test2 = {
                { 1, 0, 8, 0, 0, 1},
                { 0, 0, 0, 0, 3, 0},
                { 0, 3, 0, 0, 0, 0},
                { 0, 5, 0, 0, 0, 0}, 
                { 0, 5, 0, 0, 0, 0},
                { 0, 5, 4, 0, 0, 0},
                { 0, 9, 0, 0, 1, 0},
                { 0, 5, 0, 0, 0, 0},
                { 0, 5, 0, 5, 0, 0},
                { 0, 5, 0, 0, 0, 0},            
            };
 
            Matrixm = new Matrix(test);
            Matrixm2 = new Matrix(test2);
 
            Console.WriteLine(m);
            Console.WriteLine(m2);
 
            Matrixres = m.Mul(m2);
            Console.WriteLine(res);
 
            SimpleMul(test, test2);
 
            //m.Translate();
            //Console.WriteLine(m);
            Console.ReadKey();
        }
    }
}
 
 

 

分享到:
评论

相关推荐

    稀疏矩阵的转置

    在计算机科学和编程领域,稀疏矩阵是一种高效的数据结构,用于存储那些大部分元素为零的矩阵。这样的矩阵在处理大规模问题时特别有用,因为它们节省了内存和计算资源。本项目涉及稀疏矩阵的转置操作,这是在处理这类...

    稀疏矩阵十字链表存储

    "稀疏矩阵十字链表存储" 稀疏矩阵十字链表存储是指在计算机科学中,对稀疏矩阵进行存储的一种方法。稀疏矩阵是指矩阵中的大多数元素为零,只有少数元素非零的矩阵。由于稀疏矩阵的特点,我们可以使用十字链表来存储...

    稀疏矩阵的运算

    ### 稀疏矩阵的基本概念 稀疏矩阵是指在矩阵中大部分元素为零的矩阵。在实际应用中,为了节省存储空间以及提高计算效率,通常采用特殊的存储方式来表示稀疏矩阵,即只存储非零元素及其位置信息。 ### 稀疏矩阵的...

    稀疏矩阵课程设计实验报告

    《稀疏矩阵课程设计实验报告》 稀疏矩阵是一种针对大量元素为零的矩阵进行高效存储和计算的数据结构。在数据结构课程设计中,我们通常会涉及到稀疏矩阵的加法、乘法以及转置等基本操作。这些操作在处理大规模矩阵时...

    稀疏矩阵运算器(C语言实现,代码完整,可读性很好)

    稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算 可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 功能要求: 1. 以“带行逻辑链接信息”的三元组顺序表表示...

    稀疏矩阵转置_clearlybgo_稀疏矩阵转置_稀疏矩阵_

    在计算机科学中,稀疏矩阵(Sparse Matrix)是一种用于存储大量零元素的矩阵数据结构,因为常规的二维数组表示方式在处理零元素众多的矩阵时会浪费大量的存储空间。稀疏矩阵转置是矩阵运算中的一个重要操作,它涉及...

    采用十字链表表示稀疏矩阵,并实现矩阵的加法运算

    稀疏矩阵的十字链表表示和矩阵加法运算 稀疏矩阵是一种特殊的矩阵,矩阵中的大多数元素都是零。在计算机科学中,稀疏矩阵的表示和操作是非常重要的。十字链表是一种常用的数据结构,用来表示稀疏矩阵。在本文中,...

    稀疏矩阵的插入,删除等操作

    ### 稀疏矩阵及其操作实现 #### 一、稀疏矩阵的概念与表示 稀疏矩阵是指矩阵中大部分元素为零或不关心的值的一种特殊矩阵。为了节省存储空间和提高处理效率,稀疏矩阵通常不会按常规方式存储所有元素,而是只存储非...

    【稀疏矩阵计算器】实现加法、转置。

    稀疏矩阵是一种特殊的矩阵表示方式,它主要用于存储大量零元素的矩阵。在计算机科学和数学中,当处理大型矩阵时,尤其是那些大部分元素为零的矩阵,使用稀疏矩阵可以大大节省存储空间和计算时间。本项目提供的"稀疏...

    数据结构实验报告(稀疏矩阵)

    数据结构实验报告主要探讨了稀疏矩阵的概念、运用以及如何实现其基本运算。稀疏矩阵是一种特殊的矩阵,其中大部分元素为零。对于这样的矩阵,直接按照常规方式存储会浪费大量空间,因此通常采用压缩存储的方式来优化...

    稀疏矩阵运算器加法和减法运算(三元组)

    根据给定的信息,本文将详细解释稀疏矩阵的加法和减法运算,特别是通过三元组表示法实现这些操作的过程。文中涉及的关键概念包括稀疏矩阵、三元组表示法以及具体的C语言代码实现。 ### 稀疏矩阵与三元组表示法 ###...

    十字链表实现稀疏矩阵的加法

    十字链表实现稀疏矩阵的加法 稀疏矩阵是一种特殊的矩阵,其中大多数元素为零,而非零元素稀疏分布在矩阵之中。为了高效地存储和操作稀疏矩阵,十字链表是一种常用的存储结构。十字链表是一种链式存储结构,每个非零...

    Python 稀疏矩阵-sparse 存储和转换

    ### Python稀疏矩阵-Sparse存储和转换详解 #### 一、引言 在科学计算、机器学习以及数据分析等领域,我们经常会遇到大型矩阵,其中大部分元素为零,这类矩阵被称为**稀疏矩阵**。如果直接使用Python标准库如NumPy来...

    稀疏矩阵的相加

    ### 知识点详解 ...通过以上内容,我们可以了解到稀疏矩阵的定义及其存储方式,并深入理解了如何实现稀疏矩阵的相加操作。这不仅有助于提高对稀疏矩阵的理解,还能帮助我们更好地掌握相关的算法设计技巧。

    三元组实现稀疏矩阵加减乘

    ### 三元组实现稀疏矩阵加减乘 #### 基本概念 在计算机科学领域,稀疏矩阵是指那些非零元素远少于零元素的矩阵。由于稀疏矩阵中的大多数元素为零,直接使用二维数组存储会造成大量的空间浪费。因此,在实际应用中...

    稀疏矩阵的转置 一个稀疏矩阵A的转置矩阵B

    稀疏矩阵是一种特殊的矩阵表示方式,用于处理大量元素为零的矩阵。在计算机科学和工程领域,这种表示方法能够显著节省存储空间和计算时间。在本主题中,我们将深入探讨稀疏矩阵的转置,以及如何用C语言实现这一操作...

    数据结构稀疏矩阵的转置

    在计算机科学中,数据结构是组织和管理大量数据的关键元素,而稀疏矩阵是一种非常有用的数据结构,尤其在处理大量零元素的矩阵时。稀疏矩阵通常用于存储那些非零元素远远少于总元素数量的矩阵,以节省存储空间和提高...

    用三元组实现的稀疏矩阵运算

    在计算机科学中,稀疏矩阵(Sparse Matrix)是一种用于存储大量零元素的矩阵表示方法,因为对于具有大量零元素的矩阵,直接使用二维数组存储会浪费大量的存储空间。在这种情况下,三元组(Triplet)表示法是一种常用...

    稀疏矩阵运算器 数组和广义表

    稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,握高计算效率。实现一个能进行稀硫矩阵基本运算的运算器。 二、基本要求 以“带行逻辑链接信息”的三元组顺序表表示...

Global site tag (gtag.js) - Google Analytics