C++实现对象化的矩阵相乘小程序

 更新时间:2021年09月16日 16:09:30   作者:超自然祈祷  
这篇文章主要为大家详细介绍了C++实现对象化的矩阵相乘小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

复习数学1的线性代数,矩阵相乘这块有点晕,想编个C++对象化的矩阵相乘小程序。

相乘部分

void sum(juzhen a, juzhen b, juzhen &c)
{
 int s=0;
 for (int i = 1; i <= a.m1(); i++)//A矩阵的M
  for (int j = 1; j <= b.n1(); j++)//B矩阵的S
  {
   for (k0 = 1; k0 <= a.n1(); k0++)//a.n1也就是b.m1(a的n,b的n)【行向量*列向量】
   {
    s += a.read(i,k0)*b.read(k0,j);
   }
    c.write(i, j, s);
    s = 0;
  }
}

公式:

代码中的头两个for循环就是i,j的。公式中的k从1到p求和就是里面的k0的for循环。

容易出现误解的就是公式中只是表示第“[i][j]”元素,而不是整个矩阵,整个矩阵的结果需要外面的两个for循环。

本质:这就是个p维向量(高中就记2维)的两向量相乘公式而已【结果为数,是新矩阵的一个元素】

可运行代码:

#include<iostream>
#include <string>
using namespace std;
 
class juzhen
{
private:
 int m,n;//长宽
 int num[10][10] = {0};
 string name;
 
public:
  void size(int a,int b)
  { m = a;
  n = b; }
  void set()
  {
   cout << "此矩阵规模:" << this->m <<","<< this->n << endl;//=====?
   for (int i = 1; i <= this->m; i++)
    for (int j = 1; j <= this->n; j++)
    {
     cin >> this->num[i][j];
    }
   cout << "输入完成"<< endl;
  }
  void display()
  {
   for (int i = 1; i <= this->m; i++)//===i为行号(第几行),j为列号
    for (int j = 1; j <= this->n; j++)
    {
     cout << this->num[i][j] << " ";
    if (j == this->n) cout << endl;//先输出再换行
    }
  }
  int read(int a, int b) { return num[a][b]; }//调用此函数,得[m][n]元素的值
  void write(int a, int b,int count) {  num[a][b]=count; }//第三个参数的值,传递给[a][b]元素
  int m1() { return m; }//调用得到矩阵的m
  int n1() { return n; }//调用得到矩阵的n
};
 
int m0, n0, s0, k0;//矩阵规模(容易搞混的东西)
 
void sum(juzhen a, juzhen b, juzhen &c)//矩阵相乘公式所在。。。【要改实参值的要用&引用】
{
 for (int i = 1; i <= a.m1(); i++)//A矩阵的M
  for (int j = 1; j <= b.n1(); j++)//B矩阵的S
  {
 
   int s = 0;
   for (k0 = 1; k0 <= a.n1(); k0++)//a.n1也就是b.m1(a的n,b的n)【行向量*列向量】
   {
    s += a.read(i,k0)*b.read(k0,j);//因为用了C++,所以没那么直观,就是a[i][k]*b[k][j],套个for循环求累加和(就是高中时向量的点乘)
   }
    c.write(i, j, s);
  }
}
int main()
{
 juzhen A,B,C;
 cout << "设定m,s,n。A的m*s,B的s*n(横条数*纵条数)"<<endl;
 cin >> m0>> s0>> n0;
 A.size(m0, s0);
 B.size(s0, n0);
 
 C.size(m0, n0);
 
 A.set();
 B.set();
 
 sum(A, B, C);//C=A*B
 cout << "结果C的m*n:" << endl;
 C.display();
 
 return 0;
}

样例输入及输出:

1 0          1 0           1 0
0 1      *   0 1      =   0 1

如图所示两个矩阵

懒得打了……就如图所示两个矩阵

PS:函数中形参引用真好用,过去一直不知道,省得用指针了。(不然改不了C矩阵的实际元素值)

void sum(juzhen a, juzhen b, juzhen &c) 
//矩阵相乘公式所在。。。【要改实参值的要用&引用】

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言读取data.json文件并存入MySQL数据库小案例(推荐)

    C语言读取data.json文件并存入MySQL数据库小案例(推荐)

    本文介绍如何使用C语言结合cJSON库读取JSON文件,并将数据存储到MySQL数据库中,示例代码包括创建MySQL表的SQL语句和C语言代码,以及如何编译和运行程序,确保已安装必要的库以支持程序运行
    2024-10-10
  • C语言对磁盘文件进行快速排序简单实例

    C语言对磁盘文件进行快速排序简单实例

    这篇文章主要介绍了C语言对磁盘文件进行快速排序简单实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++11异步与通信之std::async的使用

    C++11异步与通信之std::async的使用

    std::async 异步运行一个函数,将返回值保存在std::future中,本文主要介绍了C++11异步与通信之std::async的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Microsoft Visual C++ 安装失败 0x80070666的问题解决

    Microsoft Visual C++ 安装失败 0x80070666的问题解

    本文主要介绍了Microsoft Visual C++ 安装失败 0x80070666的问题解决,错误可能由已安装其他VisualC++版本、VisualC++安装异常、Windows更新计划安装同一VisualC++包等原因引起,下面就来介绍一下解决方案,感兴趣的可以了解一下
    2025-03-03
  • C语言详细讲解循环语句的妙用

    C语言详细讲解循环语句的妙用

    C语言循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构,在循环过程中还有关键字break、continue、do、break控制中断继续与结束等操作
    2022-04-04
  • C语言软件spi虚拟总线中间层设计详解

    C语言软件spi虚拟总线中间层设计详解

    这篇文章主要为大家介绍了C语言软件spi虚拟总线中间层设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 关于C语言操作符的那些事(超级全)

    关于C语言操作符的那些事(超级全)

    这篇文章主要给大家介绍了关于C语言操作符的那些事儿,c语言的操作符有很多,包括算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员,需要的朋友可以参考下
    2021-08-08
  • 基于C语言实现UDP客户端

    基于C语言实现UDP客户端

    UDP是一种面向无连接的传输层协议,广泛应用于实时性要求较高的场景,本文将介绍如何使用C语言实现一个简单的UDP客户端程序,有需要的可以参考下
    2024-10-10
  • C语言实现扫雷游戏源代码

    C语言实现扫雷游戏源代码

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C语言输出旋转后数组中的最小数元素的算法原理与实例

    C语言输出旋转后数组中的最小数元素的算法原理与实例

    这篇文章主要介绍了C语言输出旋转后数组中的最小数元素的算法原理与实例,数组旋转就是把开头的几个指定的元素放到数组的末尾,需要的朋友可以参考下
    2016-03-03

最新评论