线性代数中矩阵的简单计算

#include"iostream"
#include"time.h"
using namespace std;
class matrix{
private:
    double **a;
    int list;
    int line;
public:
    matrix(int line,int list);
    void creatmatrix(double *a1);    //通过一维数组创建矩阵
    void cinmatrix();                //通过输入创建矩阵
    void show();                    //显示矩阵
    matrix& operator*(matrix &m);    //计算矩阵
    matrix& operator*(double b);
    matrix& operator+(matrix &m);
    matrix& operator-(matrix &m);
    double determinant();            //计算方阵的行列式
    matrix& adjoint();                //伴随矩阵
    matrix& inverse();                //逆矩阵
    void info(){
        if(line != list){
            return;
        }
        cout<<"方阵的行列式:"<<determinant()<<endl;
        cout<<"伴随矩阵:\n";
        adjoint().show();
        cout<<"逆矩阵:\n";
        inverse().show();
    }
};
//3 3 1 2 1 2 1 0 1 0 1
//3 3 2 1 1 1 4 -4 1 0 2
//4 4 1 1 1 1 2 4 3 1 4 16 9 1 8 64 27 1
int main(){
    void randtest();
    void cinmatrix(int n = 1);
    randtest();                    //随机生成矩阵
    //cinmatrix();                //输入矩阵:行数 列数 所有值
    return 0;
}
void randtest(){
    const int n = 120;
    matrix m1(3,3),m2(3,3);
    double a[n];
    srand(time(NULL));
    for(int i = 0;i < n;i++){
        a[i] = rand()%6;
    }
    m1.creatmatrix(a);
    m2.creatmatrix(a);
    m1.show();
    m1.info();
    //m2.show();
    //(m1 * m2).show();
}
void cinmatrix(int n){
    int line,list;
    cout<<"输入矩阵的行,列和各个值,空格隔开"<<endl;
    cin>>line>>list;
    matrix m1(line,list);
    matrix *m2;
    m1.cinmatrix();
    if(n == 2){
        cin>>line>>list;
        m2 = new matrix(line,list);
        m2->cinmatrix();
    }
    m1.show();
    m1.info();
    if(n == 2){
        m2->show();
        (m1 * *m2).show();
    }
}
matrix::matrix(int line,int list){
    this->list = list;
    this->line = line;
    a = new double*[line];
    for(int i = 0;i < line;i++){
        a[i] = new double[list];
    }
}

void matrix::creatmatrix(double *a1){
    for(int i = 0;i < line;i++){
        for(int j = 0;j < list;j++){
            a[i][j] = a1[i * list + j];
        }
    }
}
void matrix::cinmatrix(){
    for(int i = 0;i < line;i++){
        for(int j = 0;j < list;j++){
            cin>>a[i][j];
        }
    }
}
void matrix::show(){
    cout.precision(3);
    for(int i = 0;i < line;i++){
        cout<<"|\t";
        for(int j = 0;j < list;j++){
            cout<<a[i][j]<<"\t";
        }
        cout<<"|"<<endl;
    }
    cout<<endl;
}

matrix& matrix::operator+(matrix &m){
    matrix *m1 = new matrix(this->line,m.list);
    if(list != m.list||line != m.line){
        cout<<"error"<<endl;
        return *m1;
    }
    for(int i = 0;i < line;i++){
        for(int j = 0;j < m.list;j++){
            m1->a[i][j] = a[i][j] + m.a[i][j];
        }
    }
    return *m1;
}

matrix& matrix::operator-(matrix &m){
    matrix *m1 = new matrix(this->line,m.list);
    if(list != m.list||line != m.line){
        cout<<"error"<<endl;
        return *m1;
    }
    for(int i = 0;i < line;i++){
        for(int j = 0;j < m.list;j++){
            m1->a[i][j] = a[i][j] - m.a[i][j];
        }
    }
    return *m1;
}

matrix& matrix::operator*(matrix &m){
    matrix *m1 = new matrix(this->line,m.list);
    if(list != m.line){
        cout<<"error"<<endl;
        return *m1;
    }
    for(int i = 0;i < line;i++){
        for(int j = 0;j < m.list;j++){
            double sum = 0;
            for(int w = 0,h = 0;w < this->list;w++,h++){
                sum += this->a[i][w] * m.a[h][j];
            }
            m1->a[i][j] = sum;
        }
    }
    return *m1;
}

matrix& matrix::operator *(double b){
    matrix *m1 = new matrix(line,list);
    for(int i = 0;i < line;i++){
        for(int j = 0;j < list;j++){
            m1->a[i][j] = a[i][j] * b;
        }
    }
    return *m1;
}

double matrix::determinant(){
    if(list!=line){
        cout<<"error"<<endl;
        return 0;
    }
    if(list==1){
        return a[0][0];
    }
    else{
        double result = 0;
        matrix b(line - 1,list - 1);
        for(int j = 0;j < list;j++){
            int i2 = 0,j2 = 0;
            for(int i1 = 1;i1 < line;i1++){
                for(int j1 = 0;j1 < list;j1++){
                    if(j1 != j){                    //划去第一行第j1列,创建一个新矩阵
                        b.a[i2][j2++] = a[i1][j1];
                        if(j2 == b.list){
                            j2 = 0;
                            i2++;
                        }
                    }
                }
            }
            if(j%2==0){
                result += a[0][j] * b.determinant();
            }
            else{
                result -= a[0][j] * b.determinant();
            }
        }
        return result;
    }
}
matrix& matrix::adjoint(){                //伴随矩阵
    matrix *m = new matrix(line,list);
    matrix m1(line - 1,list - 1);
    if(line != list){
        cerr<<"out of space!"<<endl;
        return *m;
    }
    for(int i = 0;i < line;i++){
        for(int j = 0;j < list;j++){
            int i2 = 0,j2 = 0;
            for(int i1 = 0;i1 < line;i1++){
                for(int j1 = 0;j1 < list;j1++){
                    if(i1 != i && j1 != j){
                        m1.a[i2][j2++] = a[i1][j1];
                        if(j2 == m1.list){
                            i2++;
                            j2 = 0;
                        }
                    }
                }
            }
            if((j + i) % 2 == 0){
                m->a[j][i] = m1.determinant();
            }
            else{
                m->a[j][i] = -1 * m1.determinant();
            }
        }
    }
    return *m;
}

matrix& matrix::inverse(){
    matrix m = this->adjoint();
    return m * (1 / this->determinant());
}

原文地址:https://www.cnblogs.com/oleolema/p/9028412.html

时间: 2024-08-30 12:57:21

线性代数中矩阵的简单计算的相关文章

Python中的简单计算

Python中的简单计算 (1)基本的加减乘除 >>> 2 + 2 4 >>> 50 - 5*6 20 >>> (50 - 5*6) / 4 5.0 >>> 8 / 5  1.6 (2)除法总是会返回一个浮点数,想要返回整数,需要用"//"来表示(floor division),另外,可以用"%"进行取余操作 >>> 17 / 3  # classic division ret

dx11 入门 Tutorial 04: DX、HLSL中矩阵的内存存储和数学计算方式 DirectXSampleBrowser(June 2010)

主要是两方面: 1.shader数据和dx的通信,使用constant Buffer 2.矩阵的数学计算方式和内存存储方式再DX和HLSL中的异同 先说第一个: dx中的常量数据matrix等传入shader中流程: The first thing that we need to do is declare three constant buffer variables. Constant buffers are used to store data that the application n

矩阵乘法的计算和来源

矩阵乘法的计算 矩阵,是线性代数中的基本概念之一.一个m×n的矩阵就是m×n个数排成m行n列的一个数阵. 矩阵乘法是一种高效的算法可以把一些一维递推优化到log(n),还可以求路径方案等,所以更是一种应用性极强的算法.必须注意的是,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义. 一般单说矩阵乘积时,指的便是一般矩阵乘积.若A为m×n矩阵,B为n×p矩阵,则他们的乘积AB(有时记做A·B)会是一个m×p矩阵.其乘积矩阵的元素如下面式子得出: 上面是一个通过代数公式的方式说明这类乘法的抽象性

读书-算法《程序设计导引及在线实践》-简单计算题2:棋盘上的距离

题目:棋盘上的距离 求国际象棋中王.后.车.象从起始位置到目标位置所需的最少步骤. 行走规则如下: 王:横.竖.斜都可以走,但每步只能走一格. 后:横.竖.斜都可以走,但每步格数不限. 车:横.竖都可以走,不能斜着走,每步格数不限. 象:只能斜着走,格数不限. 我没有下过国际象棋,但题目中这四种角色的行走规则.把题目翻译一下,在一个8*8 的矩阵里面,按照给定的规则从一个点到另一个点的最近路径,好像也不用翻译,题目就是这么说的. 代码实现如下: #include <stdio.h> #incl

java中,一个简单但出错率又大的‘加法’题,1+1+&#39;1&#39;+1+1+1+1+&quot;1&quot;=?

1+1+'1'+1+1+1+1+"1"=? 结果是多少?很多人看了题之后,可能会说结果是71.  当然有的童鞋可能会说很简单,放工具里运行一下就知道结果了,如果不运行代码,你会得出一个什么样的结果呢? 如果告诉你答案是551,会迷惑么?怎么会得出551? 下面我们来看看怎么算的: 1.我们大家都知道1 .'1'."1"的区别,1 表示一个int类型,’1'是表示一个char类型,"1" 表示一个字符串类型. 2.1+1+'1'+1+1+1+1+&

集算器实现报表中零散的不规则计算

报表中存在的不规则计算往往给报表开发带来很大的困难,使用报表工具往往很难甚至无法直接实现.这里的不规则计算是指报表中存在特殊条件的统计项(计算),如:销售订单金额统计中计算前5名销售金额的合计和占比:学生成绩统计中总成绩排名前10的学生中语数外都超过90分的人数:用户充值统计中充值金额超过充值总额一半的用户数量等. 通过集算器可以很方便完成这类报表的开发,我们通过两个例子来了解一下具体的做法. 1.实例一 1.1 .报表描述 根据员工与订单表统计各销售人员的销售情况,并在报表中计算列出订单总额.

线性代数之矩阵与坐标系的转换

空间中的点是可以用向量来描绘的,这些点的描绘是基于我们自建的欧式空间坐标系下.我们可以用一个行向量来表示一个空间的点.那我们的要进行空间坐标的转换的时候怎么办呢?一个行向量 B,我可以理解成IB,B的三个值既为三个行向量(1,0,0),(0,1,0),(0,0,1)上的三个分量的度量.我们设向量M是一个3x3的向量.M是线性无关.即M得三个行向量a1,a2,a3不共面,Mx=B,这时候 是一个3x1的列向量x.x=           X1           Y1          Z1 Mx

Opengl中矩阵和perspective/ortho的相互转换

Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定义一个四维向量vec4. 1 /// <summary> 2 /// Represents a four dimensional vector. 3 /// </summary> 4 public struct vec4 5 { 6 public float x; 7 public f

SDUT OJ 2616 简单计算

简单计算 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 某天,XX 给YY 出了一道题,题目是: 给出n 个十进制的数,找出这n 个数的二进制表示中1 的个数最少的数. 由于YY 的计算能力很差,所以他想让你帮他写个程序来计算出来. 输入 输入的第一行为一个正整数T(1 ≤T≤20),代表测试数据组数. 对于每组测试数据: 输入的第一行为一个正整数n (1 ≤ n ≤105): 第二行为n 个正整数A1.A2.… .An(1