c ++矩阵计算

时间:2011-02-28 12:30:25

标签: c++ matrix

我创建了以下问题(现在)将计算行列式或矩阵。(我将扩展它,这就是我输入维度和矩阵的原因)。

EDITED --->>>问题仍然存在:

  • 它无法识别我的函数中的变量“mat”。

错误:'mat'未在此范围内声明

 #include <iostream>
 #include <cstdio>
 #include <cstdlib> 
 #include <cmath>

using namespace std;

class matrix {
private:
int rows,columns;

public:
//constructor
matrix ()
{}
matrix(int _rows,int _columns) : rows(_rows),columns(_columns){
{
 int **mat=new int *[rows];
    for (int r = 0; r < rows; ++r)
        mat[r] = new int[columns];
}

}
//destructor
~matrix(){
for (int r = 0; r < rows; ++r)
        delete[] mat[r];
    delete[] mat;

}

//void allocate();
void getdata() {

cout <<"Enter number of rows :"<<endl;
cin >>rows;
cout <<"Enter number of columns : "<<endl;
cin >> columns;

}
void fill();
double determinant();
void showdata(){

}

};



int main()
{
matrix a;

a.getdata();
a.fill();
a.determinant();

    return 0;
}



//fills the matrix
void matrix ::fill(){

    for(int i=0;i<rows;i++) {
        for(int j=0;j<columns;j++){
        cout <<"Enter the elements in a line separated by whitespace :"<<endl;
        cin >>mat[i][j];
        }
    }

}
//calculate the determinant
double matrix :: determinant (){
    double det;
    det = mat[rows][columns]*mat[rows+1][columns+1] - mat[rows][columns+1]*mat[rows+1][columns];
    cout <<"The determinant of matrix is :"<<det<<endl;}

5 个答案:

答案 0 :(得分:0)

您要做的是将mat初始化为动态大小的数组。正如您的编译器告诉您的那样,这不能在常量表达式中完成。

您必须为matrix类编写构造函数,该构造函数将rows作为参数并包含mat=new int *[rows]行。请注意,您还需要初始化 mat的每个行;你的allocate方法执行此操作,应该从构造函数中调用。

答案 1 :(得分:0)

new运算符动态分配内存(即,从免费存储中)。因此,它应该是任何成员函数的一部分,在此示例中将其返回地址分配给成员变量,而不是类声明的部分。它可以是getdata()成员函数的一部分。

而且,class需要析构函数,因为它正在管理资源。

修改1:

问题 -

  1. int **mat=new int *[rows];,是参数化构造函数中的局部变量,一旦调用构造函数完成引发内存泄漏,就会超出范围。

  2. 使用语句matrix a;,将调用默认构造函数。即matrix::matrix(),没有参数的构造函数。但是,您正在参数化构造函数中进行初始化。

  3. 为了让一切正常,试试这个 -

    class matrix
    {
        int **mat;
        // ...
    
        public:
        matrix()
        {
            cout <<"Enter number of rows :"<<endl;
            cin >>rows;
            cout <<"Enter number of columns : "<<endl;
            cin >> columns;
    
            mat=new int *[rows];
            for (int i=0;i<rows;i++) {
                mat[i]=new int [columns];
            }
        }
    
        // And no more, getdata() member function is required. Avoid it's call in main()
    };
    

    希望它有所帮助!

答案 2 :(得分:0)

看到矩阵的大小可变,并且矩阵数据将在堆中,您需要在构造函数中初始化矩阵数据或通过延迟实例化。我以前回答过创建矩阵的问题。这是它的link。如果您查看那里,您可以观察到在矩阵的大小已知之前未初始化数据,并且在您的情况下,它是在堆内存中创建的。

编辑:C ++在声明时不允许在堆中初始化成员变量。在您的情况下,首先不知道使用正确大小的内存创建mat矩阵的大小。正如这里的每个人所提到的,使用构造函数来创建mat实例。

答案 3 :(得分:0)

mat的初始化属于构造函数,比如说

matrix::matrix(int _rows, int _columns)
: rows(_rows)
, columns(_columns)
, mat(new int *[rows])
{
    for (int r = 0; r < rows; ++r)
        mat[r] = new int[columns];
}

不要忘记析构函数:

matrix::~matrix()
{
    for (int r = 0; r < rows; ++r)
        delete[] mat[r];
    delete[] mat;
}

话虽如此,我强烈反对发明另一个“我自己的矩阵类库”。使用有效且已建立的内容,例如Eigen

另外,对于容器,除非你有充分的理由,否则请使用一些好的类库。例如。标准库std::vector等等,或者(根据我的口味更好):Qt类,如QVector。

答案 4 :(得分:0)

立即提问:

mat似乎是构造函数中的局部变量,而不是类成员 ij是在fill()但未determinant()

中声明的局部变量

还有其他主要问题:

  • 您的矩阵未初始化rowscolumns。这些将具有任意随机值,并且考虑到它们是有符号的整数,甚至可能是负数。您的构造函数可能会抛出bad_alloc

  • 填写什么?

  • 这不是获得行列式的正确公式,无论如何只适用于平方矩阵

  • 你最好使用矢量而不是数组而只使用一个矢量。查看C++ FAQ以查看制作矩阵的最简单方法。

    假设你确实希望它是int而不是double的矩阵,用这种方式声明“mat”:

    std::vector<int> mat;

你的构造函数应该是这样的:

matrix::matrix (int r,int c) :
   rows(r), columns(c), mat(r*c)
{
    //body
}

重载运算符[]因此:

int* operator[](int r)
{
    return &mat[r*columns];
}

const int* operator[](int r) const
{
    return &mat[r*columns];
}

注意我们有2个。可以根据另一个实现一个。有些人还想重载operator()来获取2个参数,即行和列,但上面的方法都可以。

对于维度,您可能更喜欢使用size_t而不是int。