-1

我使用動態多維數組在C++中製作了矩陣乘法程序。當我輸入測試值 矩陣A = row1 {1},row2 {2}矩陣B = row1 {它使用調試。但程序工作正常,當我輸入 矩陣A =行1 {1,2},行2 {3,4}矩陣B =行1 {5,6},行2 {7,8}動態多維數組

我想這個程序是一個可以乘以所有矩陣的通用程序

#include <iostream> 
using namespace std; 

class Lab_02 
{ 
public: 
    void Product(){ 
    int a1Rows, a1Columns; 
    int a2Rows, a2Columns; 
    cout << "Plz Enter the no. of rows for Array 1  :"; 
    cin >> a1Rows; 

    cout << "Plz Enter the no. of columns for Array 1 :"; 
    cin >> a1Columns; 

    cout << "Plz Enter the no. of rows for Array 2  :"; 
    cin >> a2Rows; 

    cout << "Plz Enter the no. of columns for Array 2 :"; 
    cin >> a2Columns; 

    int **dynamicArray = 0; 
    int **dynamicArray2 = 0; 
    int **dynamicArray3 = 0; 
    cout << endl; 


    for (int i = 0; i < a1Rows; i++) 
    { 
     dynamicArray3 = new int *[a1Rows]; 
    } 
    for (int i = 0; i < a2Columns; i++) 
    { 
     dynamicArray3[i] = new int[a2Columns]; 
    } 



    // memory allocated for elements of rows. 
    for (int i = 0; i < a1Rows; i++) 
    { 
     dynamicArray = new int *[a1Rows]; 
    } 
    // memory allocated for elements of each column. 
    for (int i = 0; i < a1Columns; i++) 
    { 
     dynamicArray[i] = new int[a1Columns]; 
    } 


    // memory allocated for elements of rows. 
    for (int i = 0; i < a2Rows; i++) 
    { 
     dynamicArray2 = new int *[a2Rows]; 
    } 
    // memory allocated for elements of each column. 
    for (int i = 0; i < a2Columns; i++) 
    { 
     dynamicArray2[i] = new int[a2Columns]; 
    } 


    cout << "enter the values or array 1 \n"; 
    for (int i = 0; i < a1Rows; i++) 
    { 
     for (int j = 0; j < a1Columns; j++) 
     { 
      cout << "array[" << i << "][" << j << "]\t"; 
      cin >> dynamicArray[i][j]; 

     } 

    } 

    cout << "enter the values or array 2 :\n"; 

    for (int i = 0; i < a2Rows; i++) 
    { 
     for (int j = 0; j < a2Columns; j++) 
     { 
      cout << "array[" << i << "][" << j << "]\t"; 
      cin >> dynamicArray2[i][j]; 

     } 
    } 


    int sum; 


    for (int i = 0; i < a1Rows; i++) 
    { 
     for (int j = 0; j < a1Columns ; j++) 
     { 
      sum = 0; 
      for (int k = 0; k < a2Columns ; k++) 
      { 
       sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]); 
      } 
      dynamicArray3[i][j] = sum; 
     } 

    } 


     cout <<"Result" << endl << endl; 
     for (int i = 0; i < a1Rows; i++) 
     { 
      for (int j = 0; j < a2Columns; j++) 
      { 
       cout << dynamicArray3[i][j] << "\t"; 

      } 
      cout << endl; 
     } 


    } 
    }; 


     void main(void) 
     { 

     Lab_02 object; 
      object.Product(); 

      } 
+0

爲什麼你不使用'std :: vector'並消除這些問題? – PaulMcKenzie 2014-09-28 06:22:25

+0

因爲我必須這樣做! ,旁邊如果可能那麼爲什麼不,我會稍後研究更好的方法,首先我必須通過每個概念:) – ShearzAhmed 2014-09-28 06:34:20

+0

我不明白你對你輸入的描述。您爲Array1輸入了多少行和列,您爲Array2輸入了多少行/列? – PaulMcKenzie 2014-09-28 06:36:08

回答

0

您的內存分配是基礎問題。 他們更改爲類似下面的

// memory allocated for elements of rows. 
dynamicArray = new int *[a1Rows]; 

// memory allocated for elements of each column. 
for (int i = 0; i < a1Rows; i++) 
{ 
    dynamicArray[i] = new int[a1Columns]; 
} 

您需要分配陣列中的一個陣列的行,然後你需要循環行並分配列。

+0

這正是我在做的:( 你可以看到我和你的代碼,它們是完全一樣的 – ShearzAhmed 2014-09-28 08:00:38

+0

不,你在循環中分配行,然後遍歷列數來分配列 – user1781290 2014-09-28 08:08:00

0

代碼的問題是,你不應該在循環中分配「行」。您只需要爲行分配一個分配,然後循環爲每一行分配數據。

因此,例如,而不是這樣的:

for (int i = 0; i < a1Rows; i++) 
{ 
    dynamicArray = new int *[a1Rows]; 
} 
// memory allocated for elements of each column. 
for (int i = 0; i < a1Columns; i++) 
{ 
    dynamicArray[i] = new int[a1Columns]; 
} 

正確的方法應該是這樣:

dynamicArray = new int *[a1Rows]; 
for (int i = 0; i < a1Columns; i++) 
{ 
    dynamicArray[i] = new int[a1Columns]; 
} 

你爲每個環的同樣的錯誤。

此外,一些要點:

  1. 您未能解除分配已分配的內存。
  2. 如果您使用std::vector,那麼事情變得更容易。
  3. 在執行sum循環之前,您需要檢查矩陣是否可以相乘。通過multiplyable這意味着列矩陣A和B的行數滿足要求A的乘法和B.

    for (int i = 0; i < a1Rows; i++) 
    { 
        for (int j = 0; j < a1Columns; j++) 
        { 
         sum = 0; 
         for (int k = 0; k < a2Columns; k++) 
          sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]); 
         dynamicArray3[i][j] = sum; 
        } 
    } 
    

這個循環將就會失控,如果dynamicArray1dynamicArray2沒有必要相乘前的列數和行數。

首先,下面的測試應該乘以之前完成:

if (a1Columns != a2Rows) 
    return; 

其次,你的k循環是錯誤的。它應該是這樣的:

for (int k = 0; k < a2Rows; k++) 
    sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]); 
dynamicArray3[i][j] = sum; 
+0

嘿PaulMcKenz, 我同意你的所有3分:) 我使用循環的內存分配行的原因是因爲我想這個程序是一般程序,可以乘以所有可乘的矩陣的 – ShearzAhmed 2014-09-28 10:04:38

+0

如果我有一個矩陣,超過1行,得到我的觀點? – ShearzAhmed 2014-09-28 10:06:37

+0

@ user3812696 - 你的k循環是錯誤的。看到我更新的答案。 – PaulMcKenzie 2014-09-28 17:45:53