【问题标题】:Dynamic Memory Allocation Matrix动态内存分配矩阵
【发布时间】:2021-12-19 19:21:32
【问题描述】:

为 Matrix 分配内存的最佳选择是什么? 我需要在 first Mat Constructor 中分​​配内存。 second Mat 构造函数需要 1 个参数,当 Matrix 被认为是一维数组时,行数将为 1。我还必须在第二个构造函数中分配内存。

矩阵数据应为double

这是我尝试过的:

#include<iostream>

class Mat{
    uint16_t rows;
    uint16_t colls;
    double *mData; // the 2D array// matrix

    Mat(uint16_t r, uint16_t c){ // constructor with 2 parameters -
        // alocating memory for matrix
        this-> rows = r;
        this-> colls = c;
        this-> mData = new double [rows][colls];
    }
    Mat(uint16_t x){ //constructor with 1 parameter // alocating memory
        //for the case when number of rows = 1 , so the matrix becomes 1D array[] 
        this-> rows = x;
        this-> mData = new double [rows];
    }
    
};

我不擅长指针,所以我无法弄清楚我错过了什么。

“数组大小不是一个常数表达式”

--更新--

完整请求: 通过实现其内容来创建 Mat 类,如下所示:

该类必须包含 2 个私有属性,称为 mCols 和 mRows。这些是矩阵的维度,它们的类型是没有 16 位标记的 16 位整数。

该类必须包含 1 个名为 mData 的私有属性。这是一个指向双精度小数的指针,该指针的内存将在构造函数中分配。

一个构造函数,它接受两个无标记整数作为参数,表示数组的行数和列数,并分配内存来存储这些值。

第二个构造函数将单个数字作为参数。在这种情况下,数组被认为是一个向量,行数默认为 1,接收到的参数表示列数。当然,在这种情况下也必须分配能够存储数字的内存。

第三个不带任何参数的构造函数。它只会初始化值为0的整数属性。

第四个构造函数,它将是复制构造函数。它接收 const Mat & 类型的对象作为参数,其作用是将给定对象的所有属性值作为参数复制到当前对象 (this) 中。

新代码:

class Mat{
private:
    uint16_t mRows;
    uint16_t mCols;
    double *mData;
public:
    Mat(uint16_t r, uint16_t c){
        mRows = r;
        mCols = c;
        mData = new double[mRows * mCols];
    }
    Mat(uint16_t c){
        mCols = c;
        mRows = 1;
        mData = new double [1 * mCols];
    }
    Mat(){
        mRows = 0;
        mCols = 0;
    }
    Mat(const Mat &mat) : mRows(mat.mRows), mCols(mat.mCols), mData(mat.mData){

    }

};

【问题讨论】:

  • 宁可使用std::vector&lt;uint16_t&gt; 大小的rows * cols,并为您的Mat 类提供uint16_t operator()(int row, int col)。互联网上有很多例子,如何做到这一点。
  • 最好的选择是不要。使用std::vectorSomething like this 是矩阵类的默认起点。
  • 如果在编译时知道大小,而且通常是这样,你可以使用模板
  • 附注帮助您简化代码:一维数组是二维数组,其中一个维度的大小始终为 1。
  • 你真的需要一个单行的特殊情况吗?只需使用第一个构造函数并为行传递 1。

标签: c++ arrays class heap-memory


【解决方案1】:

首先,你需要使用 double** 而不是 double* 来实现二维数组

其次,我猜你需要公共构造函数(现在你有私有的)

当然最好使用std::vector,但是如果你不想,你可以使用我建议的代码:

 Mat(uint16_t r, uint16_t c){ // constructor with 2 parameters -
    // alocating memory for matrix
    this-> rows = r;
    this-> colls = c;
    this->mData = new double*[rows];
    for(int i = 0; i < rows; i++) {
        mData[i] = new double[colls];
    }

}

【讨论】:

  • 有效,但这是缓慢而愚蠢的方式。它可以用double * 来实现,并且单次间接使事情变得非常非常快。
  • 既然提问者已经澄清了问题,程序要求强烈建议提问者必须使用一级指针间接。我认为double** 在这里不可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2021-10-13
  • 2019-09-30
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多