Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;使用动态分配内存乘法矩阵 我试图在C++中编写一个函数,它将两个已经动态分配的矩阵A和B相乘。我目前正在尝试让乘法代码工作,然后我将尝试将其转换为函数。现在我得到了一个错误的排序;“分段故障(堆芯倾倒)”。我已经把它缩小到代码的乘法部分,但我不知道它有什么问题。有人能帮我吗?我的代码如下所示 #include <iostream> #include <cassert> int main() { int rowsA = 5; // number of rows int colsA= 3; // number of coloumns // dynamically allocating A double** A; A = new double* [rowsA]; A[0] = new double [rowsA*colsA]; for (int i = 1; i < rowsA; i++) { A[i] = A[i-1] + colsA; } // Storing elements of matrix A for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsA; ++j) { std::cout << "Enter element A" << i + 1 << j + 1 << " : "; std::cin >> A[i][j]; } } int rowsB = 3; // number of rows int colsB = 5; // number of coloumns // dynamically allocating B double** B; B = new double* [rowsB]; B[0] = new double [rowsB*colsB]; for (int i = 1; i < rowsB; i++) { B[i] = B[i-1] + colsB; } // Storing elements of matrix B for(int i = 0; i < rowsB; ++i) { for(int j = 0; j < colsB; ++j) { std::cout << "Enter element B" << i + 1 << j + 1 << " : "; std::cin >> B[i][j]; } } // checking matrix multiplication qualification assert(colsA == rowsB); // dynamically allocating C double** C; C = new double* [rowsA]; C[0] = new double [rowsA*colsB]; for (int i = 1; i < rowsA; i++) { C[i] = C[i-1] + colsB; } // Initializing elements of matrix C to 0 for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { C[i][j]=0; } } // multiplication for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { for(int k = 0; k < colsB; ++k) { C[i][j] += A[i][k] * B[k][j]; } } } // Displaying the multiplication of matrices A, B std::cout<< "Matrix C: " << std::endl; for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { std::cout << " " << C[i][j]; if(j == colsB-1) { std::cout << std::endl; } } } // deallocation delete[] C[0]; delete[] C; delete[] B[0]; delete[] B; delete[] A[0]; delete[] A; } #包括 #包括 int main() { int rowsA=5;//行数 int colsA=3;//列数 //动态分配 双**A; A=新的双精度*[rowsA]; A[0]=新的双精度[rowsA*colsA]; 对于(int i=1;i_C++_Matrix Multiplication_Dynamic Allocation - Fatal编程技术网

C++;使用动态分配内存乘法矩阵 我试图在C++中编写一个函数,它将两个已经动态分配的矩阵A和B相乘。我目前正在尝试让乘法代码工作,然后我将尝试将其转换为函数。现在我得到了一个错误的排序;“分段故障(堆芯倾倒)”。我已经把它缩小到代码的乘法部分,但我不知道它有什么问题。有人能帮我吗?我的代码如下所示 #include <iostream> #include <cassert> int main() { int rowsA = 5; // number of rows int colsA= 3; // number of coloumns // dynamically allocating A double** A; A = new double* [rowsA]; A[0] = new double [rowsA*colsA]; for (int i = 1; i < rowsA; i++) { A[i] = A[i-1] + colsA; } // Storing elements of matrix A for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsA; ++j) { std::cout << "Enter element A" << i + 1 << j + 1 << " : "; std::cin >> A[i][j]; } } int rowsB = 3; // number of rows int colsB = 5; // number of coloumns // dynamically allocating B double** B; B = new double* [rowsB]; B[0] = new double [rowsB*colsB]; for (int i = 1; i < rowsB; i++) { B[i] = B[i-1] + colsB; } // Storing elements of matrix B for(int i = 0; i < rowsB; ++i) { for(int j = 0; j < colsB; ++j) { std::cout << "Enter element B" << i + 1 << j + 1 << " : "; std::cin >> B[i][j]; } } // checking matrix multiplication qualification assert(colsA == rowsB); // dynamically allocating C double** C; C = new double* [rowsA]; C[0] = new double [rowsA*colsB]; for (int i = 1; i < rowsA; i++) { C[i] = C[i-1] + colsB; } // Initializing elements of matrix C to 0 for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { C[i][j]=0; } } // multiplication for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { for(int k = 0; k < colsB; ++k) { C[i][j] += A[i][k] * B[k][j]; } } } // Displaying the multiplication of matrices A, B std::cout<< "Matrix C: " << std::endl; for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { std::cout << " " << C[i][j]; if(j == colsB-1) { std::cout << std::endl; } } } // deallocation delete[] C[0]; delete[] C; delete[] B[0]; delete[] B; delete[] A[0]; delete[] A; } #包括 #包括 int main() { int rowsA=5;//行数 int colsA=3;//列数 //动态分配 双**A; A=新的双精度*[rowsA]; A[0]=新的双精度[rowsA*colsA]; 对于(int i=1;i

C++;使用动态分配内存乘法矩阵 我试图在C++中编写一个函数,它将两个已经动态分配的矩阵A和B相乘。我目前正在尝试让乘法代码工作,然后我将尝试将其转换为函数。现在我得到了一个错误的排序;“分段故障(堆芯倾倒)”。我已经把它缩小到代码的乘法部分,但我不知道它有什么问题。有人能帮我吗?我的代码如下所示 #include <iostream> #include <cassert> int main() { int rowsA = 5; // number of rows int colsA= 3; // number of coloumns // dynamically allocating A double** A; A = new double* [rowsA]; A[0] = new double [rowsA*colsA]; for (int i = 1; i < rowsA; i++) { A[i] = A[i-1] + colsA; } // Storing elements of matrix A for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsA; ++j) { std::cout << "Enter element A" << i + 1 << j + 1 << " : "; std::cin >> A[i][j]; } } int rowsB = 3; // number of rows int colsB = 5; // number of coloumns // dynamically allocating B double** B; B = new double* [rowsB]; B[0] = new double [rowsB*colsB]; for (int i = 1; i < rowsB; i++) { B[i] = B[i-1] + colsB; } // Storing elements of matrix B for(int i = 0; i < rowsB; ++i) { for(int j = 0; j < colsB; ++j) { std::cout << "Enter element B" << i + 1 << j + 1 << " : "; std::cin >> B[i][j]; } } // checking matrix multiplication qualification assert(colsA == rowsB); // dynamically allocating C double** C; C = new double* [rowsA]; C[0] = new double [rowsA*colsB]; for (int i = 1; i < rowsA; i++) { C[i] = C[i-1] + colsB; } // Initializing elements of matrix C to 0 for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { C[i][j]=0; } } // multiplication for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { for(int k = 0; k < colsB; ++k) { C[i][j] += A[i][k] * B[k][j]; } } } // Displaying the multiplication of matrices A, B std::cout<< "Matrix C: " << std::endl; for(int i = 0; i < rowsA; ++i) { for(int j = 0; j < colsB; ++j) { std::cout << " " << C[i][j]; if(j == colsB-1) { std::cout << std::endl; } } } // deallocation delete[] C[0]; delete[] C; delete[] B[0]; delete[] B; delete[] A[0]; delete[] A; } #包括 #包括 int main() { int rowsA=5;//行数 int colsA=3;//列数 //动态分配 双**A; A=新的双精度*[rowsA]; A[0]=新的双精度[rowsA*colsA]; 对于(int i=1;i,c++,matrix-multiplication,dynamic-allocation,C++,Matrix Multiplication,Dynamic Allocation,首先,你说你正确分配了矩阵,但我没有看到任何证据。你分配了一个指针数组,只初始化了第一个索引。例如,A[0]。这是不正确的。你需要分配每一行 你有: double** A; A = new double* [rowsA]; A[0] = new double [rowsA*colsA]; //Incorrect. You only allocated A[0]. for(int i = 0; i < rowsA; ++i) { for(int j = 0; j &l

首先,你说你正确分配了矩阵,但我没有看到任何证据。你分配了一个指针数组,只初始化了第一个索引。例如,
A[0]
。这是不正确的。你需要分配每一行

你有:

double** A;
A = new double* [rowsA];
A[0] = new double [rowsA*colsA]; //Incorrect. You only allocated A[0].
  for(int i = 0; i < rowsA; ++i)
   {
      for(int j = 0; j < colsB; ++j)
      {
         for(int k = 0; k < colsB; ++k) //ColsB is incorrect. Should be colsA..
         {
            C[i][j] += A[i][k] * B[k][j]; //Segfaults here due to bad iteration..

         }
      }
   }
您需要通过[rowsA-1]分配[0]

接下来,您的乘法循环(最里面的循环)不正确。它应该是:

迭代该内部循环的ColsA

你有:

double** A;
A = new double* [rowsA];
A[0] = new double [rowsA*colsA]; //Incorrect. You only allocated A[0].
  for(int i = 0; i < rowsA; ++i)
   {
      for(int j = 0; j < colsB; ++j)
      {
         for(int k = 0; k < colsB; ++k) //ColsB is incorrect. Should be colsA..
         {
            C[i][j] += A[i][k] * B[k][j]; //Segfaults here due to bad iteration..

         }
      }
   }
for(int i=0;i
以下是正确的:

#include <iostream>
#include <cassert>

double** create_matrix(int rows, int cols)
{
    double** mat = new double* [rows]; //Allocate rows.
    for (int i = 0; i < rows; ++i)
    {
        mat[i] = new double[cols](); //Allocate each row and zero initialize..
    }
    return mat;
}

void destroy_matrix(double** &mat, int rows)
{
    if (mat)
    {
        for (int i = 0; i < rows; ++i)
        {
            delete[] mat[i]; //delete each row..
        }

        delete[] mat;  //delete the rows..
        mat = nullptr;
    }
}

int main()
{
    int rowsA = 5; // number of rows
    int colsA= 3; // number of coloumns
    double** matA = create_matrix(rowsA, colsA);


    int rowsB = 3; // number of rows
    int colsB = 5; // number of coloumns
    double** matB = create_matrix(rowsB, colsB);


    //Checking matrix multiplication qualification
    assert(colsA == rowsB);


    double** matC = create_matrix(rowsA, colsB);

    //Multiplication
    for(int i = 0; i < rowsA; ++i)
    {
        for(int j = 0; j < colsB; ++j)
        {
            for(int k = 0; k < colsA; ++k) //ColsA..
            {
                matC[i][j] += matA[i][k] * matB[k][j];
            }
        }
    }


    //Clean up..
    destroy_matrix(matA, rowsA);
    destroy_matrix(matB, rowsB);
    destroy_matrix(matC, rowsA);
}
#包括
#包括
双**创建矩阵(整数行,整数列)
{
double**mat=新的double*[行];//分配行。
对于(int i=0;i
首先,您说您正确分配了矩阵,但我看不到任何证据。您分配了指针数组,只初始化了第一个索引。
A[0]
例如,这是不正确的。您需要分配每一行

你有:

double** A;
A = new double* [rowsA];
A[0] = new double [rowsA*colsA]; //Incorrect. You only allocated A[0].
  for(int i = 0; i < rowsA; ++i)
   {
      for(int j = 0; j < colsB; ++j)
      {
         for(int k = 0; k < colsB; ++k) //ColsB is incorrect. Should be colsA..
         {
            C[i][j] += A[i][k] * B[k][j]; //Segfaults here due to bad iteration..

         }
      }
   }
您需要通过[rowsA-1]分配[0]

接下来,您的乘法循环(最里面的循环)不正确。它应该是:

迭代该内部循环的ColsA

你有:

double** A;
A = new double* [rowsA];
A[0] = new double [rowsA*colsA]; //Incorrect. You only allocated A[0].
  for(int i = 0; i < rowsA; ++i)
   {
      for(int j = 0; j < colsB; ++j)
      {
         for(int k = 0; k < colsB; ++k) //ColsB is incorrect. Should be colsA..
         {
            C[i][j] += A[i][k] * B[k][j]; //Segfaults here due to bad iteration..

         }
      }
   }
for(int i=0;i
以下是正确的:

#include <iostream>
#include <cassert>

double** create_matrix(int rows, int cols)
{
    double** mat = new double* [rows]; //Allocate rows.
    for (int i = 0; i < rows; ++i)
    {
        mat[i] = new double[cols](); //Allocate each row and zero initialize..
    }
    return mat;
}

void destroy_matrix(double** &mat, int rows)
{
    if (mat)
    {
        for (int i = 0; i < rows; ++i)
        {
            delete[] mat[i]; //delete each row..
        }

        delete[] mat;  //delete the rows..
        mat = nullptr;
    }
}

int main()
{
    int rowsA = 5; // number of rows
    int colsA= 3; // number of coloumns
    double** matA = create_matrix(rowsA, colsA);


    int rowsB = 3; // number of rows
    int colsB = 5; // number of coloumns
    double** matB = create_matrix(rowsB, colsB);


    //Checking matrix multiplication qualification
    assert(colsA == rowsB);


    double** matC = create_matrix(rowsA, colsB);

    //Multiplication
    for(int i = 0; i < rowsA; ++i)
    {
        for(int j = 0; j < colsB; ++j)
        {
            for(int k = 0; k < colsA; ++k) //ColsA..
            {
                matC[i][j] += matA[i][k] * matB[k][j];
            }
        }
    }


    //Clean up..
    destroy_matrix(matA, rowsA);
    destroy_matrix(matB, rowsB);
    destroy_matrix(matC, rowsA);
}
#包括
#包括
双**创建矩阵(整数行,整数列)
{
double**mat=新的double*[行];//分配行。
对于(int i=0;i
您需要在2D动态分配数组中分配每一行:您好。谢谢。我已经这样做了。当我注释掉乘法并让我的代码打印C(初始化为全部0)时,它可以将其打印到控制台。当我修改代码时,它也会打印A和B。因此,我认为乘法部分有问题。您需要在2D动态分配数组中分配每一行:您好。谢谢。我已经这样做了。当我注释掉乘法并要求我的代码打印C(初始化为全部0)时,它可以很好地打印到控制台。当我修改代码时,它也会打印A和B。所以,我认为乘法部分有问题。