矩阵乘法【C&C++】

今天做了一个矩阵乘法的题,一开始感觉没什么,但是在做的时候去发现这题不是那么简单的,(可能是我太菜了吧),所以写在这里,防止以后忘了。。。。。。

矩阵乘法,学过线性代数的话应该都知道规则
现在这里有两个矩阵
1 2 3
4 5 6

1 2 3 4 3 2 1
2 3 4 5 4 3 2
3 4 5 6 5 4 3
他们是可以相乘的因为矩阵1的列数等于矩阵2的行数,相乘的规则是,用矩阵亿的每行分别对应去乘矩阵2的每一列,并对结果叠加,举个例子:就上述矩阵而言,结果矩阵的第一行第一列就是矩阵1的第一行和矩阵2的第一列对应乘积的和

当然,思路纯暴力模拟。。。。。。

下面是代码

【1.单组------C实现】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int h1,l1,h2,l2,h3,l3;//h表示行数,l表示列数
    int a[100][100],b[100][100],c[100][100];//a吧,是原矩阵,c是相乘后的矩阵
    scanf("%d%d%d%d",&h1,&l1,&h2,&l2);
    if(l1!=h2)//判断矩阵是否能相乘
        printf("0\n");
    else
    {
        h3=h1;//对相乘后的矩阵行列赋值
        l3=l2;
        int i,j;
        for(i=0;i<h1;i++)//输入原矩阵
            for(j=0;j<l1;j++)
            scanf("%d",&a[i][j]);
        for(i=0;i<h2;i++)
            for(j=0;j<l2;j++)
            scanf("%d",&b[i][j]);
        int p=0,q=0;//用来调整矩阵乘法的参数
        for(i=0;i<h3;i++)
        {
            for(j=0;j<l3;j++)
            {
                int t;
                p=0;
                q=0;
                for(t=0;t<l1;t++)//每次需要循环l1或者h2次,并对应位置相乘叠加
                {
                    c[i][j]+=a[i][p]*b[q][j];
                    p++;
                    q++;
                }
            }
        }
        for(i=0;i<h3;i++)
            for(j=0;j<l3;j++)
        {
            j==l3-1?printf("%d\n",c[i][j]):printf("%d ",c[i][j]);
        }
    }
    return 0;
}

【2.多组输入------C++实现】
多组情况需要注意的是每次需要对相乘得到的矩阵清空,因为二维数组不好清空(其实是我不会),所以这里的方法是再每次输出后直接将对应位置赋值为0即可

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;2 3 3 7

int main()
{
    ios::sync_with_stdio(false);
    int h1,l1,h2,l2,h3,l3;
    int a[100][100],b[100][100],c[100][100];
    while(cin>>h1>>l1>>h2>>l2)
    {
        if(l1!=h2)
            cout<<'0'<<endl;
        else
        {
            h3=h1;
            l3=l2;
            for(int i=0;i<h1;i++)
            {
                for(int j=0;j<l1;j++)
                {
                    cin>>a[i][j];
                }
            }
            for(int i=0;i<h2;i++)
            {
                for(int j=0;j<l2;j++)
                {
                    cin>>b[i][j];
                }
            }
            int p=0,q=0;
            for(int i=0;i<h3;i++)
            {
                for(int j=0;j<l3;j++)
                {
                    p=0;
                    q=0;
                    for(int t=0;t<l1;t++)
                    {
                        c[i][j]+=a[i][p]*b[q][j];
                        p++;
                        q++;
                    }
                }
            }
            for(int i=0;i<h3;i++)
            {
                for(int j=0;j<l3;j++)
                {
                    j==l3-1?cout<<c[i][j]<<endl:cout<<c[i][j]<<" ";
                    c[i][j]=0;
                }
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值