`

矩阵相关

J# 
阅读更多
矩阵:是一个具有m行n列的二维数组。

上三角矩阵:只存储对角线及对角线(左上角到右下角)以上的元素。反之则称为下三角矩阵。

稀疏矩阵:非0元素远远小于0元素个数,而且这些元素没有规律

矩阵转置:把原矩阵的行,列对换,在原矩阵中[i][j]位置中的元素,交换到转置矩阵中[j][i]的位置上
SparseMatrix.h
#include<iostream>
#include<stdlib.h>
#include<cassert>
using namespace std;
const int DefaultSize = 100;
template<class T>

class Trituple{
public:
    int row,col;
    T val;//非0元素值
    Trituple<T> &operator=(Trituple<T>& x){
        row = x.row;
        col = x.col;
        val = x.val;
    }
};

template<class T>
class SparseMatrix{
    friend ostream& operator<<(ostream& out,SparseMatrix<T>& M){
        out << "Rows:" << M.Rows << endl;
        out << "Cols:" << M.Cols << endl;
        out << "Terms:" << M.Terms << endl;
        for(int i=0;i<M.Terms;++i){
            out << "M[" << M.smArray[i].row << ","
                << M.smArray[i].col << "]:" << M.smArray[i].val
                << endl;
        }
        return out;
    }
    friend istream& operator>>(istream& in,SparseMatrix<T>& M){
        cout << "Enter number of rows,columns,and terms" << endl;
        in >> M.Rows >> M.Cols >> M.Terms;
        if(M.Terms>M.maxTerms){
            cerr << "Number of terms overflow!" << endl;
            exit(1);
        }
        for(int i=0;i<M.Terms;++i){
            cout << "Enter rows,columns and value of term:" << i+1 << endl;
            in >> M.smArray[i].row >> M.smArray[i].col >> M.smArray[i].val;
        }
        return in;
    }
public:
    SparseMatrix(int maxSz=DefaultSize);
    SparseMatrix(SparseMatrix<T>& x);
    ~SparseMatrix(){delete[] smArray;}
    SparseMatrix<T>& operator=(SparseMatrix<T>& x);
    SparseMatrix<T> Transpose();
    SparseMatrix<T> Add(SparseMatrix<T>& b);
    SparseMatrix<T> Multiply(SparseMatrix<T>& b);
private:
    int Rows,Cols,Terms;//非0元素个数
    Trituple<T> *smArray;
    int maxTerms;
};

template<typename T>
SparseMatrix<T>::SparseMatrix(int maxSz):maxTerms(maxSz)
{
    if(maxSz<1){
        cerr << "invalid size" << endl;
        exit(1);
    }
    smArray = new Trituple<T>[maxSz];
    assert(smArray!=NULL);
    Rows = Cols = Terms = 0;
}

template<typename T>
SparseMatrix<T>::SparseMatrix(SparseMatrix<T> &x)
{
    Rows = x.Rows;
    Cols = x.Cols;
    Terms = x.Terms;
    maxTerms = x.maxTerms;
    smArray = new Trituple<T>[maxTerms];
    assert(smArray!=NULL);
    for(int i=0;i<maxTerms;++i){
        smArray[i] = x.smArray[i];
    }
}

/*
  返回一个新的矩阵,它是原矩阵的转置
  */
template<typename T>
SparseMatrix<T> SparseMatrix<T>::Transpose()
{
    SparseMatrix b(maxTerms);//转置矩阵的三元组表
    b.Rows = Cols;
    b.Cols = Rows;
    b.Terms = Terms;
    if(Terms>0)
    {
        int currentB = 0;
        for(int i=0;i<Cols;++i)//按列优先顺序依次存放
        {
            for(int t=0;t<Terms;++t)
            {
                if(smArray[t].col==i)
                {
                    b.smArray[currentB].col = smArray[t].row;
                    b.smArray[currentB].row = smArray[t].col;
                    b.smArray[currentB].val = smArray[t].val;
                    currentB++;
                }
            }
        }
    }
}

/*
  前提条件是:两矩阵的大小相同,行数和列数分别对应相等
  */
template<typename T>
SparseMatrix<T> SparseMatrix<T>::Add(SparseMatrix<T> &b)
{
    SparseMatrix<T> result(maxTerms);
    if(Rows!=b.Rows||Cols!=b.Cols){
        cerr << "can not add" << endl;
        return result;
    }
    int termA = Terms,termB = b.Terms,indexA,indexB;
    int i=0,j=0,k=0;
    //O(Terms+b.Terms)比直接两个for循环O(Terms*b.Terms)要好
    while(i<termA||j<termB){
        //计算位置
        indexA = Cols*smArray[i].row+smArray[i].col;
        indexB = Cols*b.smArray[i].row+b.smArray[i].col;
        if(indexA>indexB){
            result.smArray[k]=b.smArray[j];
            j++;
        }
        if(indexA<indexB){
            result.smArray[k]=smArray[i];
            i++;
        }
        if(indexA==indexB){
            result.smArray[k].col = smArray[i].col;
            result.smArray[k].row = smArray[i].row;
            result.smArray[k].val = smArray[i].val+b.smArray[j].val;
            i++;
            j++;
        }
        k++;
    }
    while(i<termA){
        result.smArray[k] = smArray[i];
        i++;
        k++;
    }
    while(j<termB){
        result.smArray[k] = b.smArray[j];
        j++;
        k++;
    }
    result.Terms = k;
    return result;
}

/*
  前提条件是:A的列数=B的行数
  */
template<typename T>
SparseMatrix<T> SparseMatrix<T>::Multiply(SparseMatrix<T> &b)
{
    SparseMatrix<T> result(Rows*b.Cols);
    if(Cols!=b.Rows){
        cerr << "can not multiply" << endl;
        return result;
    }
    if(Terms==maxTerms||b.Terms==maxTerms){
        cerr << "One additional space is a or b needed" << endl;
        return result;
    }
    int *rowSize = new int[b.Rows];
    int *rowStart = new int[b.Rows+1];
    T *temp = new T[b.Cols];
    int i,Current,lastInResult,RowA,ColA,ColB;
    for(i=0;i<b.Rows;i++)
        rowSize[i] = 0;
    for(i=0;i<b.Terms;i++)
        rowSize[b.smArray[i].row]++;
    rowStart[0]=0;
    for(i=1;i<=b.Rows;i++)
        rowStart[i] = rowStart[i-1]+rowSize[i-1];
    Current = 0;
    lastInResult = -1;
    while(Current<Terms){
        RowA = smArray[Current].row;
        for(i=0;i<b.Cols;i++)
            temp[i]=0;
        while(Current<Terms&&smArray[Current].row==RowA){
            ColA = smArray[Current].col;
            for(i=rowStart[ColA];i<rowStart[ColA+1];i++){
                ColB = b.smArray[i].col;
                temp[ColB] += smArray[Current].val*b.smArray[i].val;
            }
            Current++;
        }
    }
    for(i=0;i<b.Cols;i++){
        if(temp[i]!=0){
            lastInResult++;
            result.smArray[lastInResult].row = RowA;
            result.smArray[lastInResult].col = i;
            result.smArray[lastInResult].val = temp[i];
        }
    }
    result.Rows = Rows;
    result.Cols = Cols;
    result.Terms = lastInResult+1;
    delete[] rowSize;
    delete[] rowStart;
    delete[] temp;
    return result;
}


分享到:
评论

相关推荐

    Matlab 矩阵相关函数

    Matlab 矩阵相关函数 Matlab 矩阵相关函数是 Matlab 编程语言中的一组强大且灵活的矩阵操作工具,用于矩阵对角线元素的抽取、上三角阵和下三角阵的抽取、矩阵的变维、矩阵分解、线性方程的组的求解、秩与线性相关性...

    矩阵相关计算的类

    "矩阵相关计算的类"是编程中的一个工具,它允许开发者通过对象化的形式来处理和操作矩阵,从而简化复杂的线性运算。 矩阵是一种二维数组,用大写字母表示,如A、B等。它由行和列组成,每个元素都被称为矩阵的元素或...

    xg_spearman相关性_矩阵_矩阵相关系数_

    在这个场景中,"xg_spearman相关性_矩阵_矩阵相关系数_"的标题指的是使用Spearman相关系数来分析矩阵中的列之间的关系。 Spearman相关系数,通常表示为ρ(rho),是一种评估两个排名变量之间关系强度和方向的指标...

    多篇矩阵相关的论文

    10. **鳞状因子循环矩阵方程解的条件与求解的快速算法**:鳞状因子矩阵与循环矩阵相关,解此类矩阵方程时,快速算法可以改善求解的效率。这些算法可能涉及到预处理步骤以简化问题,从而加快求解速度。 这些论文共同...

    矩阵求逆包含矩阵相关运算

    矩阵求逆包含相关运算

    矩阵相关计算的python实现

    这是一个矩阵相关运算的代码,包括了求矩阵的加减,乘积,逆,行列式等的python代码。

    xiangguanxishu.zip_相关系数_矩阵 相关

    在IT领域,尤其是在数据分析和机器学习中,"相关系数"和"矩阵相关"是至关重要的概念。本项目涉及的文件提供了处理这些概念的程序代码,包括读取和写入文件、矩阵规范化以及计算相关系数矩阵的功能。以下是这些知识点...

    矩阵力量,介绍矩阵相关知识

    介绍矩阵相关知识

    Toeplitz矩阵及逆矩阵求解

    在实际应用中,理解和掌握如何高效求解Toeplitz矩阵相关的线性方程组和逆矩阵,对于优化信号处理算法、加速数值计算和提高数据分析效率至关重要。例如,在数字信号处理中,Toeplitz矩阵常常出现在滤波器设计、谱分析...

    EXCEL在矩阵相关计算中的应用.pdf

    在探讨Excel在矩阵相关计算中的应用时,首先需要了解矩阵是什么,以及它们在数学和工程学领域中被如何应用。矩阵是数字的矩形排列,可以表示线性方程组、进行线性变换等操作,是数学分析、工程学、物理学和计算机...

    C语言实现矩阵相关操作

    矩阵的运算可运用在多个领域,诸如:线性系统,图像处理,机器学习等,本文档主要用C语言来实现矩阵相关的操作。

    输出刚度矩阵,整体刚度矩阵,Python

    文件列表中的"iSolver"可能是指一种求解器或者与求解刚度矩阵有关的工具或脚本。在Python中,可以使用如SLEPc、PETSc等科学计算库来求解大规模线性和非线性问题,包括求解刚度矩阵对应的线性系统。 总结来说,这个...

    Matlab常用命令(矩阵相关).doc

    在MATLAB中,矩阵是其核心操作对象,因此掌握矩阵相关的命令对于高效使用MATLAB至关重要。以下是一些MATLAB中常用的矩阵命令及其详细说明: 1. `size(a)`:这个命令用于获取矩阵`a`的尺寸。对于二维矩阵,它会返回...

    emd.zip_EMD 相关性_matlab相关性图_矩阵 距离_矩阵相关_矩阵距离

    6. **矩阵相关性分析**: 这个过程涉及计算矩阵的相关系数矩阵,然后可能包括主成分分析(PCA)、因子分析或其他降维技术,以便更好地理解矩阵元素间的关系。相关性分析有助于识别潜在的结构和模式,这对于数据挖掘和...

    MATLAB矩阵相关.docx

    MATLAB矩阵相关.docx

    MATLAB矩阵相关.pdf

    MATLAB矩阵相关.pdf

    HankelMatrix_构件汉克尔矩阵_

    此文件可能扩展了汉克尔矩阵的构造,比如添加了矩阵的加法操作,或者实现了其他与汉克尔矩阵相关的算法,如奇异值分解(SVD)或谱分析。这有助于对矩阵进行进一步的分析,如识别系统的频率特性或稳定性。 6. 应用...

    Ansys刚度矩阵相关.zip_ANSYS刚度矩阵_刚度矩阵_刚度矩阵 ansys

    在ANSYS这一强大的有限元分析软件中,刚度矩阵是一个至关重要的概念,它在结构静力学分析、动力学分析及优化设计等多个领域中扮演着核心角色。本文将深入探讨ANSYS中的刚度矩阵,包括其定义、计算方法、以及如何在...

    和矩阵相关的头文件matrix.h

    ### 和矩阵相关的头文件matrix.h知识点解析 #### 文件概述 `matrix.h` 是一个自定义的C++头文件,用于实现基本的矩阵操作。当在C++程序开发过程中遇到“找不到 matrix.h”这类错误时,可以通过创建并填充该头文件来...

    矩阵相关运算的c程序

    在编程领域,矩阵运算是一种常见的计算任务,尤其在科学计算、图像处理、机器学习等领域有着广泛的应用。本项目是基于C语言实现的矩阵运算程序,包括矩阵的加法、乘法以及求逆等基础操作,并且特别涉及了卡尔曼滤波...

Global site tag (gtag.js) - Google Analytics