【基础算法】矩阵的几种基本运算 & 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月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
40 4
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
570 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
124 0
|
2月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
2月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
2月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
2月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)