【基础算法】矩阵的几种基本运算 & C++实现

简介: 从线性代数中我们已知,两个矩阵可以进行加减乘运算,但矩阵之间没有除法运算。

●矩阵的加减乘(数乘)转置运算


       从线性代数中我们已知,两个矩阵可以进行加减乘运算,但矩阵之间没有除法运算。(下面以3×3矩阵为例):

5417a3096888b8900e9607f9919df8f9_96312207d6af40519c5172d6cdc7feaa.png


        矩阵的数乘运算类属与两矩阵相乘的一种特殊形式(数乘矩阵的这个数,我们可以将其化为对角线为该数,其余位置都为0的矩阵,再用该对角矩阵乘我们要乘的这个矩阵)直接用数乘以矩阵中的每一个数即可。转置矩阵为将矩阵的行列互换得到的新矩阵称为转置矩阵,转置矩阵的行列式不变。下面我们展示数乘和转置两个算法的关键代码片段:


{
  double juzhen[3][3] = { {1,2,3},
        {4,5,6},
        {7,8,9} };  
  double n;cin >> n;
  for (int i = 0; i < 3; i++)
  for (int j = 0; j < 3; j++)
    juzhen[i][j] = n * juzhen[i][j];
}
{
  double juzhen[3][3] = { {1,2,3},
        {4,5,6},
        {7,8,9} };  
  for (int i = 0; i < 3; i++)
  for (int j = 0; j < 3; j++)
    jizhen[j][i] = juzhen[i][j];
}

在下面代码中我们输入了两个矩阵让其进行运算(只进行加减乘)


#include<iostream>
#define i 3   //定义矩阵的行数
#define j 3   //定义矩阵的列数
using namespace std;
class juzhen {
public:
  void clear()  //将矩阵清空
  {
  this->c[i][j] = { 0 };
  }
  void add();   //相加算法
  void sub();   //相减算法
  void mul();   //相乘算法
  void showresult();
  double a[i][j];
  double b[i][j];
  double c[i][j];
};
void juzhen::add()
{
  for (int m = 0; m < i; m++)
  {
  for (int n = 0; n < j; n++)
  {
    c[m][n] = a[m][n] + b[m][n];
  }
  }
}
void juzhen::sub()
{
  for (int m = 0; m < i; m++)
  {
  for (int n = 0; n < j; n++)
  {
    c[m][n] = a[m][n] - b[m][n];
  }
  }
}
void juzhen::mul()
{
  for (int m = 0; m < i; m++)
  {
  int p = 0;
  for (int n = 0; n < j; n++)
  {
    int q = 0;
    c[m][n] = a[m][p] * b[q][n]
    + a[m][p + 1] * b[q + 1][n]
    + a[m][p + 2] * b[q + 2][n];
    //c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]
    //c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]
    //c[0][2]=a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]
    //...
  }
  }
}
void juzhen::showresult()
{
  for (int m = 0; m < i; m++)
  {
  for (int n = 0; n < j; n++)
  {
    cout << c[m][n] << " ";
  }
  cout << endl;
  }
}
juzhen jz;
void text()  //写入矩阵
{
  cout << "请输入这两个" << i << "×" << j << "矩阵:" << endl;
  cout << "①" << endl;
  for (int m = 0; m < i; m++)
  for (int n = 0; n < j; n++)
    cin >> jz.a[m][n];
  cout << "②" << endl;
  for (int m = 0; m < i; m++)
  for (int n = 0; n < j; n++)
    cin >> jz.b[m][n];
}
void text1()   //加法运算
{
  jz.clear();
  jz.add();
  cout << "两矩阵相加为:" << endl;
  jz.showresult();
}
void text2()   //减法运算
{
  jz.clear();
  jz.sub();
  cout << "两矩阵相减为:" << endl;
  jz.showresult();
}
void text3()   //乘法运算
{
  jz.clear();
  jz.mul();
  cout << "两矩阵相乘为:" << endl;
  jz.showresult();
}
int main()
{
  text();
  text1();
  text2(); 
  text3();  
}

4f9f52d6fd03fd57cdf95e1030ccc488_2258f2d4233a4f11b102a1934df87cb0.png

        综合上面的讲解及其程序代码,我们可以将加、减、乘、数乘、转置这几种基本运算的方法充分结合,运用线性代数中矩阵运算的基本公式,在程序中从而实现多个矩阵复合运算的复杂算法。


目录
相关文章
|
2天前
|
算法 数据中心 C++
基于C++雪花算法工具类Snowflake -来自chatGPT
基于C++雪花算法工具类Snowflake -来自chatGPT
8 1
|
8天前
|
算法 数据处理 C++
C++一分钟之-迭代器与算法
【6月更文挑战第21天】C++ STL的迭代器统一了容器元素访问,分为多种类型,如输入、输出、前向、双向和随机访问。迭代器使用时需留意失效和类型匹配。STL算法如查找、排序、复制要求特定类型的迭代器,注意容器兼容性和返回值处理。适配器和算法组合增强灵活性,但过度使用可能降低代码可读性。掌握迭代器和算法能提升编程效率和代码质量。
23 3
|
12天前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
38 10
|
12天前
|
C++
C++解决线性代数矩阵转置 小实践
【6月更文挑战第3天】C++解决线性代数矩阵转置
16 2
|
14天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
14天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
14天前
|
存储 算法 C++
【数据结构与算法】:带你手搓顺序表(C/C++篇)
【数据结构与算法】:带你手搓顺序表(C/C++篇)
|
3天前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
12 0
|
4天前
|
算法 Java
Java数据结构与算法:位运算之与、或、异或运算
Java数据结构与算法:位运算之与、或、异或运算
|
14天前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记