前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一题(1)

每日一题(1)

作者头像
C语言与CPP编程
发布2020-12-02 11:33:05
4380
发布2020-12-02 11:33:05
举报
文章被收录于专栏:c语言与cpp编程c语言与cpp编程

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。

运算如下所示:

我们可以在2个矩阵上执行加,减,乘和除运算。从用户输入一行数字和列号,组成第一个矩阵元素和第二个矩阵元素。然后,对用户输入的矩阵执行乘法。

1.思路

首先,由于输入的矩阵维数是随机的,因此,我们要设计程序,手动把行和列算出来,这样方便后续乘法运算。并且把输入的数字提取出来,放入一个float型数组中,这样我们就完成了读入工作,之后就是利用乘法公式进行运算,并把结果放入一个二维数组中,最后把结果输出来就行了。

2.数据读入

这里是容易出现问题的地方,最初的想法是用cin.getline()把整个输入都读进一个char型字符序列中,然后再用特定位置的数做乘法。后来发现有两个问题,第一,数字读入一个char字符序列中就变成了ASCII码,这个还比较好解决,用每个位置的数减去‘ 0‘就行了。第二个问题是硬伤,就是把一个数字放到一个char型的序列中,他会把连在一起的数字给拆开,比如说我想输入123,他不会把123放到一个格里,而是1放到一个格,2放入另一个格,3再放一个格。所以不能放到char[]中。于是想到把输入放到float数组里, 但是这样就有一个新问题,就是如何把符号摘出去。如果直接用cin,那么碰到符号它并不会跳过,而是也会录入,这是不行的,但是对于这个问题,我们知道输入的格式都是类似于:123,1,2;1,2,3这样的,规律就是一个数字一个符号,我们可以用赋值的方式来跳过,和;的录入。具体来说就是先用一个cin,把第一个数字录入,然后用c=getchar()的方式来跳过逗号的录入。然后再cin,再c=getchar,最终当c=getchar()等于回车,也就是\n时停止。由于c=getchar()是判断条件,所以我们这个循环要从逗号开始,也就是先录入一个数字,再进行循环。

在录入的过程中,我们就可以直接把行数和列数读取出来:行数就是;(分号)的个数加一,列数就是总共的数字个数除以行数。

代码语言:javascript
复制
cout << "please enter matrixA:"<<endl;
cin >> A[i];
while ((c=getchar()) != '\n') 
{
   cin >> A[++i];
   if (c == ';')m++;
}
  m++;
  i++;
  n = i/ m;
cout << "please enter matrixB:"<<endl;
cin >> B[j];
while ((c = getchar()) != '\n') 
{
   cin >> B[++j];
   if (c == ';')
   k++;
}
  k++;
  j++;
  p = j / k;

拿第一段,矩阵A的录入来说,m是行数,由于m作为;的计数器,因此行数要在分号个数的基础上加一,即m++,而由于A[ ]这个数组是从A[0]开始的,因此A[i]表示有i+1个数,所以i++。这样就实现了矩阵A,B的录入,虽然录进去的是一个一维的数组,但也不妨碍后续的矩阵乘法计算。

3.矩阵相乘

在矩阵乘法第一矩阵中,一个行元素乘以第二矩阵所有列元素。让我们通过下面的代码理解3 * 3和3 * 3矩阵的矩阵乘法:

下面来看看看C++中的矩阵乘法程序。

代码语言:javascript
复制
#include <iostream>  
using namespace std;  
int main()  
{  
    int a[10][10],b[10][10],mul[10][10],r,c,i,j,k;    
    cout<<"enter the number of row=";    
    cin>>r;    
    cout<<"enter the number of column=";    
    cin>>c;    
    cout<<"enter the first matrix element=\n";    
    for(i=0;i<r;i++)    
    {    
        for(j=0;j<c;j++)    
        {    
            cin>>a[i][j];  
        }    
    }    
    cout<<"enter the second matrix element=\n";    
    for(i=0;i<r;i++)    
    {    
        for(j=0;j<c;j++)    
        {    
            cin>>b[i][j];    
        }    
    }    
    cout<<"multiply of the matrix=\n";    
    for(i=0;i<r;i++)    
    {    
        for(j=0;j<c;j++)    
        {    
            mul[i][j]=0;    
            for(k=0;k<c;k++)    
            {    
                mul[i][j]+=a[i][k]*b[k][j];    
            }    
        }    
    }    
    //for printing result    
    for(i=0;i<r;i++)    
    {    
        for(j=0;j<c;j++)    
        {    
            cout<<mul[i][j]<<" ";    
        }    
        cout<<"\n";    
    }    
    return 0;  
}

执行上面代码得到以下结果

enter the number of row=3

enter the number of column=3

enter the first matrix element=

1 2 3

1 2 3

1 2 3

enter the second matrix element=

1 1 1

2 1 2

3 2 1

multiply of the matrix=

14 9 8

14 9 8

14 9 8

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言与CPP编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档