愤怒的小鸡wo 2014-03-25 08:49 采纳率: 0%
浏览 992

c++求两个矩阵的乘法,但运行出来的结果是一些不可预料的值

#include
#include
using namespace std;
class CreateMatrix
{
private:
int m,n,**p;
public:
void SetMatrix(int m,int n)
{
p=new int *[m]; //build m pointers and save m rows
for(int i=0;i if((p[i]=new int [n])==NULL)
exit(0);
for(int i=0;i {
for(int j=0;j cin>>p[i][j];
}
cout<<"the Matrix of you input:"<<endl;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cout<<p[i][j]<<"\t";
cout<<endl;
}
}
void DelMatrix(int m)
{
for(int i=0;i<m;i++)
delete[]p[i];
delete[]p;
}
friend void MatrixMul(CreateMatrix &E,CreateMatrix &F,int m,int n,int t);
};

void MatrixMul(CreateMatrix &E,CreateMatrix &F,int m,int n,int t)
{
int **q;
q=new int *[m]; //build m pointers and save m rows
for(int i=0;i<m;i++)
if((q[i]=new int [n])==NULL)
exit(0);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
for(int k=0;k<t;k++)
q[i][k]=q[i][k]+E.p[i][j]*F.p[j][k];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cout<<q[i][j]<<" ";
}

int main()
{
CreateMatrix A,B;
int a,b,c,d;
cout<<"you must ensure b=c,that is A_matrix's column equals B_matrix's row"< cout cin>>a>>b;
cout<<"input A_matrix elements:"< A.SetMatrix(a,b);
cout cin>>c>>d;
cout<<"input B_matrix elements:"<<endl;
B.SetMatrix(c,d);
MatrixMul(A,B,a,d,b);
system("pause");
return 0;
}

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-09 12:41
    关注

    该回答引用ChatGPT

    您的代码中存在一些问题,主要是关于矩阵乘法的实现和内存管理的问题。以下是修复后的代码,注释中有解释:

    #include <iostream>
    using namespace std;
    
    class CreateMatrix {
    private:
        int m, n, **p;
    public:
        void SetMatrix(int m, int n) {
            this->m = m;
            this->n = n;
            p = new int*[m];
            for (int i = 0; i < m; i++) {
                p[i] = new int[n];
                for (int j = 0; j < n; j++) {
                    cin >> p[i][j];
                }
            }
        }
        void DelMatrix() { // 释放矩阵内存
            for (int i = 0; i < m; i++) {
                delete[] p[i];
            }
            delete[] p;
        }
        friend void MatrixMul(CreateMatrix &E, CreateMatrix &F, CreateMatrix &G); // 声明友元函数
    };
    
    void MatrixMul(CreateMatrix &E, CreateMatrix &F, CreateMatrix &G) {
        int m = E.m, n = F.n, t = E.n;
        G.SetMatrix(m, n); // 初始化结果矩阵
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                G.p[i][j] = 0; // 结果矩阵先全部赋值为0
                for (int k = 0; k < t; k++) {
                    G.p[i][j] += E.p[i][k] * F.p[k][j]; // 矩阵乘法公式
                }
                cout << G.p[i][j] << " ";
            }
            cout << endl;
        }
    }
    
    int main() {
        CreateMatrix A, B, C;
        int a, b, c, d;
        cout << "you must ensure b=c, that is A_matrix's column equals B_matrix's row" << endl;
        cout << "input A_matrix's row and column: ";
        cin >> a >> b;
        cout << "input A_matrix elements:" << endl;
        A.SetMatrix(a, b);
        cout << "input B_matrix's row and column: ";
        cin >> c >> d;
        cout << "input B_matrix elements:" << endl;
        B.SetMatrix(c, d);
        MatrixMul(A, B, C);
        A.DelMatrix(); // 释放矩阵A的内存
        B.DelMatrix(); // 释放矩阵B的内存
        C.DelMatrix(); // 释放结果矩阵C的内存
        return 0;
    }
    

    修复后的代码在矩阵乘法时初始化了结果矩阵,并在计算乘法时按照矩阵乘法公式进行计算。在矩阵使用完毕后,还需要释放矩阵所占用的内存,以免出现内存泄漏问题。

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况