识别矩阵变量分配的行为
Identifying Behavior of Matrix Variable Assignment
我正在尝试开发自己的自定义 'Matrix' class 以用于 C++ 中的模式识别和神经网络。在大多数情况下,它工作正常,但我 运行 在分配变量时遇到代码问题。一种分配变量的方法不起作用,它似乎使我的代码崩溃。
为了提供一些背景知识,我的矩阵是一个名为 Matrix 的 class 中的双精度数组。我已经添加了适当的构造函数和析构函数以及一种操作矩阵的各个元素的方法。我的主要问题是分配 class 变量。假设我有两个矩阵:A 和 B。目标是将内容从 A 复制到 B。如果我尝试一种方法,我的代码将按预期工作。如果我尝试另一种方式,我的代码在执行后尝试释放时崩溃。
class Matrix{
public:
//Constructors
Matrix(); //EMPTY Matrix
Matrix(int, int); //Matrix WITH ROW AND COL
~Matrix(); //Destructor
void operator= (const Matrix &);
double & operator() (int X,int Y) const{return this->array[X][Y]; }
void print() const; //Print the Matrix
private:
double **array;
int nrows;
int ncols;
int ncell;
};
//When you want to copy a matrix to another Matrix variable
void Matrix::operator= (const Matrix &M) {
if(this->array != NULL){
for(int i=nrows-1; i>=0; i--) free(this->array[i]);
free(this->array);
this->array = NULL;
}
//Using parameters from the matrix being copied, rebuild it
this->nrows = M.nrows; this->ncols = M.ncols; this->ncell = M.ncell;
//First, create an ariray of double* for the rows
this->array = (double **) malloc(sizeof(double *)*(this->nrows));
//Next, go through each 'row', and copy over elements
for(int i=0; i<(this->nrows); i++){
this->array[i] = (double *) malloc(sizeof(double)*(this->ncols));
for(int j=0; j<(this->ncols); j++){
this->array[i][j] = M.array[i][j];
}
}
}
int main(int argc, char *argv[]){ //C.applyFunc(SP);
printf("\n\nCreating Matrix A\n");
Matrix A(1,3); A(0,0) = 8;
printf("\n\nPRINTING \n\n"); A.print();
printf("\n\nCreating B\n\n");
Matrix B = A; //THIS IS THE PROBLEM RIGHT HERE!!!
//Matrix B;
//B = A;
printf("\n\nPRINTING B\n\n"); B.print(); B(0,0) = 123;
printf("PRINTING A AGAIN\n\n"); A.print();
printf("PRINTING B AGAIN\n\n"); B.print();
return 0;
}
在我的代码中,我发布了我的 class、'=' 的运算符重载和我的主函数。其他功能没那么重要,只是打印矩阵什么的。如果您觉得它有帮助,我会稍后将其包括在内。在这里,在我的主要代码中,矩阵 A 被分配为 1x3 行矩阵,将 A[0][0] 设置为 8。打印矩阵可以验证这一点。现在,当我将 B 分配给 A(如未注释掉的行中所示)时,我希望 B 和 A 具有相同的值。后来我把B[0][0]改成了123.
最后,我希望 A 为 [8, 0, 0],B 为 [123, 0, 0]。但是,当我再次打印出 A 和 B 时,它们都是相同的 [8, 0, 0]。似乎不知何故,B 指向 A,所以当 A 在 B 之后被释放时,它已经被释放并且崩溃了。但是,当我 运行 注释代码并以这种方式分配 B 时,我的代码完全按照我的预期工作。当我调用 'Matrix B = A' 使其与下面的注释代码不同时到底发生了什么?
嗯,简而言之,
Matrix B = A;
不是关于执行赋值,而是复制构造函数,如果我没有遗漏什么,它没有在你的 class 中定义。
我正在尝试开发自己的自定义 'Matrix' class 以用于 C++ 中的模式识别和神经网络。在大多数情况下,它工作正常,但我 运行 在分配变量时遇到代码问题。一种分配变量的方法不起作用,它似乎使我的代码崩溃。
为了提供一些背景知识,我的矩阵是一个名为 Matrix 的 class 中的双精度数组。我已经添加了适当的构造函数和析构函数以及一种操作矩阵的各个元素的方法。我的主要问题是分配 class 变量。假设我有两个矩阵:A 和 B。目标是将内容从 A 复制到 B。如果我尝试一种方法,我的代码将按预期工作。如果我尝试另一种方式,我的代码在执行后尝试释放时崩溃。
class Matrix{
public:
//Constructors
Matrix(); //EMPTY Matrix
Matrix(int, int); //Matrix WITH ROW AND COL
~Matrix(); //Destructor
void operator= (const Matrix &);
double & operator() (int X,int Y) const{return this->array[X][Y]; }
void print() const; //Print the Matrix
private:
double **array;
int nrows;
int ncols;
int ncell;
};
//When you want to copy a matrix to another Matrix variable
void Matrix::operator= (const Matrix &M) {
if(this->array != NULL){
for(int i=nrows-1; i>=0; i--) free(this->array[i]);
free(this->array);
this->array = NULL;
}
//Using parameters from the matrix being copied, rebuild it
this->nrows = M.nrows; this->ncols = M.ncols; this->ncell = M.ncell;
//First, create an ariray of double* for the rows
this->array = (double **) malloc(sizeof(double *)*(this->nrows));
//Next, go through each 'row', and copy over elements
for(int i=0; i<(this->nrows); i++){
this->array[i] = (double *) malloc(sizeof(double)*(this->ncols));
for(int j=0; j<(this->ncols); j++){
this->array[i][j] = M.array[i][j];
}
}
}
int main(int argc, char *argv[]){ //C.applyFunc(SP);
printf("\n\nCreating Matrix A\n");
Matrix A(1,3); A(0,0) = 8;
printf("\n\nPRINTING \n\n"); A.print();
printf("\n\nCreating B\n\n");
Matrix B = A; //THIS IS THE PROBLEM RIGHT HERE!!!
//Matrix B;
//B = A;
printf("\n\nPRINTING B\n\n"); B.print(); B(0,0) = 123;
printf("PRINTING A AGAIN\n\n"); A.print();
printf("PRINTING B AGAIN\n\n"); B.print();
return 0;
}
在我的代码中,我发布了我的 class、'=' 的运算符重载和我的主函数。其他功能没那么重要,只是打印矩阵什么的。如果您觉得它有帮助,我会稍后将其包括在内。在这里,在我的主要代码中,矩阵 A 被分配为 1x3 行矩阵,将 A[0][0] 设置为 8。打印矩阵可以验证这一点。现在,当我将 B 分配给 A(如未注释掉的行中所示)时,我希望 B 和 A 具有相同的值。后来我把B[0][0]改成了123.
最后,我希望 A 为 [8, 0, 0],B 为 [123, 0, 0]。但是,当我再次打印出 A 和 B 时,它们都是相同的 [8, 0, 0]。似乎不知何故,B 指向 A,所以当 A 在 B 之后被释放时,它已经被释放并且崩溃了。但是,当我 运行 注释代码并以这种方式分配 B 时,我的代码完全按照我的预期工作。当我调用 'Matrix B = A' 使其与下面的注释代码不同时到底发生了什么?
嗯,简而言之,
Matrix B = A;
不是关于执行赋值,而是复制构造函数,如果我没有遗漏什么,它没有在你的 class 中定义。