愤怒的小鸡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;
    }
    

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

    评论

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误