【问题标题】:Dynamic Multidimensional array in C++C++中的动态多维数组
【发布时间】:2014-09-28 06:01:02
【问题描述】:

我使用动态多维数组在 c++ 中制作了矩阵乘法程序。 问题是当我输入测试值时 matrix A = row1{ 1 } , row2 { 2 } matrix B = row1 {1 ,2 , 3} ,它在用户所在的循环停止工作 输入第一个数组的值,我使用调试找到了它。但是当我进入时程序运行良好 矩阵 A = row1{ 1 , 2 } , row2 { 3 , 4 } 矩阵 B = row1 {5 , 6 } , row2 {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();

          }

【问题讨论】:

  • 您为什么不使用std::vector 并摆脱这些问题?
  • 因为我一定会这样做! ,除了如果可能那为什么不呢,我稍后会研究更好的方法,首先我必须了解每个概念:)
  • 我不明白您对输入内容的描述。 Array1 输入了多少行和列,Array2 输入了多少行/列?
  • 感谢您的理解 :) !用于数组 1、2 行和 1 列
  • 对于数组 2 1 行 3 列

标签: c++ arrays multidimensional-array matrix-multiplication dynamic-arrays


【解决方案1】:

您对矩阵的内存分配是问题所在。 将它们更改为以下内容

// 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];
}

您需要为行分配一个数组数组,然后您需要遍历行并分配列。

【讨论】:

  • 这正是我正在做的 :( 你可以看到我和你的代码。它们完全一样
  • 不,您是在循环中分配行,然后循环遍历列数以分配列
【解决方案2】:

代码的问题是您不应该在循环中分配“行”。您只需为行分配一次,然后循环为每一行分配数据。

例如,而不是这样:

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;

【讨论】:

  • 嘿 PaulMcKenz,我同意你的所有 3 点 :) 我使用循环来分配行的内存的原因是因为我希望这个程序是可以乘以所有可乘矩阵的通用程序
  • 如果我有一个行数超过 1 行的矩阵怎么办?
猜你喜欢
  • 2012-02-02
  • 2018-05-16
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
相关资源
最近更新 更多