首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矩阵变量分配的识别行为

矩阵变量分配的识别行为
EN

Stack Overflow用户
提问于 2019-06-27 15:46:45
回答 1查看 37关注 0票数 0

我正在尝试开发我自己的定制的“矩阵”类,以便在C++中用于模式识别和神经网络。在大多数情况下,它运行良好,但在分配变量时,我的代码遇到了问题。分配变量的一种方法不起作用,它似乎会使我的代码崩溃。

为了给出一点背景,我的矩阵是一个叫做矩阵的类中的一个双数组数组。我添加了适当的构造函数和析构函数,以及操纵矩阵中各个元素的方法。我的主要问题是分配类变量。假设我有两个矩阵:A和B。目标是将内容从A复制到B。如果我尝试一种方式,我的代码将按预期工作。如果我尝试另一种方式,我的代码在执行后尝试释放时会崩溃。

代码语言:javascript
复制
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;
}

在我的代码中,我发布了类、操作符重载'=‘和我的主要函数。其他函数不那么重要,只是打印矩阵和其他不重要的东西。如果你觉得有用的话,我稍后会把它包括进去。在这里,在我的主要代码中,矩阵A被分配为一个1x3行矩阵,将A设置为8。打印出来的矩阵验证了这一点。现在,当我将B赋值给A时,如未注释掉的行中所示,我希望B和A具有相同的值。后来,我把B改为123。

最后,我期望A是8,0,0,B是123,0,0。但是,当我再次打印A和B时,它们都是相同的,8,0,0。似乎是以某种方式,B指向A,所以当A在B之后被释放时,它已经被释放并崩溃了。但是,当我运行注释代码并以这种方式分配B时,我的代码就像我所期望的那样工作。当我调用“矩阵B=A”与下面的注释代码不同时,究竟发生了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-27 15:59:32

总之,

代码语言:javascript
复制
Matrix B = A;

不是执行赋值,而是复制构造函数,如果我没有遗漏某些内容,则在您的类中没有定义它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56794657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档