矩阵乘法 - 圆圈中的逻辑错误? (C ++ OOP)

时间:2013-11-20 07:04:02

标签: c++ matrix multiplication

我正在尝试编写乘法矩阵的代码,这是“for”cicles试图改变结果矩阵(C)的值时的一般问题。

如果您尝试执行此代码,则引入2个矩阵A& B,两个2x2,你会在结果中看到结果矩阵C只显示第一个值C [0] [0]。

我已经尝试验证方法“mult(Matriz A,Matriz B)”,但是有些事情是错的,请你帮我找到错误的内容。

#include <iostream>
#include <stdio.h>

#define TAM 10

using namespace std;

class Matriz
{
private:
    int M[TAM][TAM];
    int n, m;


public:
    Matriz ()
    {
        n = m = 1;
    }

    Matriz (int n, int m)
    {
        this->n = n;
        this->m = m;
    }

    void ingMatriz(char c)
    {
        for (int i=0; i<n; i++)
            for (int j=0; j<m; j++)
            {
                cout<<c<<"["<<i+1<<"]["<<j+1<<"]=";
                cin >>M[i][j];
            }
    }

    void muestraMatriz()
    {
        for (int i=0; i<n; i++)
        {
            cout << "\n";
            for (int j=0; j<m; j++)
                cout<<"   "<<M[i][j];
        }
    }

    void mult (Matriz A, Matriz B)
    {
        int an=A.n;
        int am=A.m;
        int bm=B.m;


        for(int a=0; a<an; a++) //This is the general cicle
            for(int b=0; b<bm; b++)
                for(int c=0; c<am; c++)
                    M[a][b] += (A.M[a][c] * B.M[c][b]);
    }

};

int main()
{
    cout << "\nxxxxxx Multiplicacion de matrices xxxxxx";

    int f1,c1,f2,c2;

    cout<< "\n \n* El numero de columnas de la 1er matriz(A) debe ser igual a numero de filas de la segunda matriz(B) *";
    cout<< "\n \nIngresa el numero de FILAS de la 1er matriz(A): ";
    cin >> f1;
    cout<< "\nIngresa el numero de COLUMNAS de la 1er matriz(A): ";
    cin >> c1;
    cout<< "\nIngresa el numero de FILAS de la 2da matriz(B): ";
    cin >> f2;
    cout<< "\nIngresa el numero de COLUMNAS de la 2da matriz(B): ";
    cin >> c2;

    if (c1==f2)
    {
        Matriz A(f1,c1);
        cout << "\nIngresa los valores de la matriz 'A': \n\n";
        A.ingMatriz('A');
        Matriz B(f1,c2);
        cout << "\n \n********************************************\nIngresa los valores de la matriz 'B': \n \n";
        B.ingMatriz('B');

        Matriz C;
        C.mult(A,B);
        cout << "\nMatriz A: ";
        A.muestraMatriz();
        cout << "\nMatriz B: ";
        B.muestraMatriz();
        cout << "\nMultiplicacion AB: ";
        C.muestraMatriz();
    }
    else
        cout << "\n \n \n El numero de columnas de la 1er matriz(A) debe ser igual al numero de filas de la segunda matriz(B) ";

    getchar();
    getchar();
    return 0;
};

我在main中只更改了一些内容,如图所示,我将对象C更改为Matriz C(f1,c2),因此可以设置结果矩阵的值,但仍显示垃圾。下面是输出图片:

http://i.stack.imgur.com/oTdK7.png

最终代码:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#define TAM 10   

using namespace std;   

class Matriz
{
      private: 
               int M[TAM][TAM];
               int n, m;
      public:
             Matriz ():n(1), m(1)
             {
                 for (int i=0; i<TAM; i++)
                 for (int j=0; j<TAM; j++)
                 M[i][j] = 0;
             }

             Matriz (int n, int m):n(n), m(m)
             {
                 for (int i=0; i<TAM; i++)
                 for (int j=0; j<TAM; j++)
                 M[i][j] = 0;
             }
             void ingMatriz(char c)
             {
               for (int i=0; i<n; i++)
                  for (int j=0; j<m; j++)
                     {
                      cout<<c<<"["<<i+1<<"]["<<j+1<<"]=";
                      cin >> M[i][j];
                     }
             }  

            void muestraMatriz()
            {
               for (int i=0; i<n; i++)
                 {
                  cout << "\n";
                  for (int j=0; j<m; j++)
                  cout<<"   "<<M[i][j];
                 }
             }   

             void mult (Matriz A, Matriz B)
             {
                  int an=A.n;
                  int am=A.m;
                  int bm=B.m;

               for(int a=0; a<an; a++)
                   for(int b=0; b<bm; b++)
                       for(int c=0; c<am; c++)                                    
                           M[a][b] += (A.M[a][c] * B.M[c][b]);             
              }
};

int main()
{
    while (0<1){
    cout << "xxxxxx Multiplicacion de matrices xxxxxx";
    int f1,c1,f2,c2;

    cout<< "\n \n* El numero de columnas de la 1er matriz(A) debe ser igual al numero de filas de la segunda matriz(B) *";

    cout<< "\n \nIngresa el numero de FILAS de la 1er matriz(A): ";
    cin >> f1;

    cout<< "\nIngresa el numero de COLUMNAS de la 1er matriz(A): ";
    cin >> c1;

    cout<< "\nIngresa el numero de FILAS de la 2da matriz(B): ";
    cin >> f2;

    cout<< "\nIngresa el numero de COLUMNAS de la 2da matriz(B): ";
    cin >> c2;

    if (c1==f2)
    {
    Matriz A(f1,c1);    
    cout << "\nIngresa los valores de la matriz 'A': \n\n";
    A.ingMatriz('A');
    Matriz B(f2,c2);

cout << "\n \n********************************************\nIngresa los valores de la matriz 'B': \n \n";
B.ingMatriz('B');
Matriz C(f1,c2);
C.mult(A,B);
cout << "\n\nMatriz A: ";
A.muestraMatriz();
cout << "\n\nMatriz B: ";
B.muestraMatriz();
cout << "\n\nMultiplicacion AB: ";
C.muestraMatriz();
}
else
cout << "\n \n \n El numero de columnas de la 1er matriz(A) debe ser igual al numero de filas de la segunda matriz(B) ";
getchar();
getchar();
system("cls");
}
return 0;
};

2 个答案:

答案 0 :(得分:1)

告诉你的主要功能是什么,这对我来说有点棘手,因为我不是西班牙语母语人士=)

但问题似乎是你使用默认构造函数初始化C,它将宽度和高度初始化为一。然后,当你试图乘以另外两个2 * 2矩阵时,你乘以的索引永远不会超过1和1 - 即使A和B都有n = 2m = 2,因为C只有{ {1}}(在其构造函数中指定),它只乘以第一个元素,然后退出两个循环。

为了得到你想要的东西,你需要先将C初始化为适当的尺寸,如下所示:

n = m = 1

然而,由于您已经知道输出矩阵的大小应该是多少,因此可能会非常烦人 - 因此,在矩阵乘法代码中,您可以分别设置Matriz C(2, 2)m = A.m,因为所得到的乘法矩阵应该具有第一矩阵的宽度和第二矩阵的高度。然后你必须确保在乘以=)

时传递正确大小的矩阵

我看到的第二个问题是你在进行乘法之前没有将C的值初始化为任何东西 - 本质上你正在进行乘法运算,但是由于你已经有了未初始化的值,当你添加乘法,垃圾+ x =更多垃圾。编辑:完成之前的意外发布。你想要的是将行n = B.n更改为M[a][b] += (A.M[a][c] * B.M[c][b]); - 这样你就可以正确地将值设置为它应该是什么,而不是添加到那里已有的值。

EDIT2:您应该在构造函数中使用循环初始化而不是在乘法代码本身中初始化(请参阅注释):

M[a][b] = (A.M[a][c] * B.M[c][b]);

答案 1 :(得分:0)

因为你将2矩阵相乘:A.n = B.m所以你的代码应该更像:

void mult (Matriz A, Matriz B)
    {
     for(k=0;k<A.m;k++)
     {
       for(i=0;i<A.n;i++)
       {
        M[i][k] = 0;
        for(j=0;j<B.m;j++)
            M[k][i] += A[k][j] * B[j][i]  
        cout << "Matriz c:" << M[k][i]<<" ";    
       }
        cout <<"\n";
      }