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。所以,我认为乘法部分有问题。