我想在建構式中為矩陣動態分配記憶體。我想 mData成為一個指向double 值的指標。
getvalue() setValue() getter 應該回傳 row_x 和 column_x 處的值,setter 應該在 row_x 和 column_x 處設定值,但 getter 和 setter 似乎不起作用;
operator 必須檢查 2 個相同大小的矩陣,并逐個元素求和。
Operator * 還需要檢查 2 個相同大小的矩陣,并逐個元素相乘。
Operator ^ 需要檢查是否可以將行乘以列 2 矩陣,然后執行此操作。
這是我的代碼:
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 [mCols];
}
Mat(){
mRows = 0;
mCols = 0;
}
Mat(const Mat &mat) : mRows(mat.mRows), mCols(mat.mCols), mData(mat.mData){
}
double getValue(uint16_t r, uint16_t c){
double val = mData [r*c c];
return val;
}
void setValue(uint16_t r, uint16_t c,double value){
mData[r*c c] = value;
}
~Mat(){
}
Mat operator (const Mat &mat){
Mat result;
int ok=0;
if(mat.mRows == mRows && mat.mCols == mCols){
ok=1;
result.mData[mRows*mCols ] = mData[mRows*mCols ] mat.mData[mat.mRows*mat.mCols];
}
if(ok == 0)
return result.mData[0];
else
return result;
}
Mat operator * (const Mat &mat){
Mat result;
int ok=0;
if(mat.mRows == mRows && mat.mCols == mCols){
ok=1;
result.mData[mRows*mCols] = mData[mRows*mCols] * mat.mData[mat.mRows*mat.mCols];
}
if(ok == 0)
return result.mData[0];
else
return result.mData[mRows*mCols];
}
Mat operator ^ (const Mat &mat){
Mat result;
int ok=0;
if(mat.mRows == mCols && mat.mCols == mRows){
ok=1;
result.mData[mRows] = mData[mRows] * mat.mData[mat.mCols];
}
if(ok == 0)
return result.mData[0];
else
return result.mData[mRows];
}
};
我想繼續這個想法,但我不確定我錯過了什么
uj5u.com熱心網友回復:
使用std::vector<double>而不是double*使記憶體管理和復制變得更容易并且更不容易出錯。我也注意到在元素方式訪問的錯誤,其中一個應該使用r*mCols c代替r*c c。要解決逐元素矩陣運算的問題,您需要遍歷所有元素:
for (size_t r = 0; r < mRows; r)
for (size_t c = 0; c < mCols; c)
result[r*mCols c] = src1[r*mCols c] src2[r*mCols c]
這是 Mat 的示例實作。operator 到目前為止,我只做了,但應該很容易擴展到其他運營商:
class Mat
{
private:
size_t mRows;
size_t mCols;
std::vector<double> mData;
public:
// constructors
Mat(size_t rows, size_t cols, double v = 0.0f)
: mRows(rows), mCols(cols), mData(mRows*mCols, v)
{}
Mat(size_t cols, double v = 0.0f)
: mRows(1), mCols(cols), mData(mRows*mCols,v)
{}
Mat()
: mRows(0), mCols(0), mData()
{}
// automatic copy & move construction just works^TM using std::vector
Mat(const Mat&) = default;
Mat(Mat&&) = default;
// same with automatic copy & move assignment
Mat& operator= (const Mat&) = default;
Mat& operator= (Mat&&) = default;
// element access
double getValue(size_t r, size_t c) const
{
return mData[r*mCols c];
}
void setValue(size_t r, size_t c, double value)
{
mData[r*mCols c] = value;
}
// element access through operator():
// Mat m(3,3); m(1,2)=5.0f;
double& operator()(size_t r, size_t c)
{
return mData[r*mCols c];
}
const double& operator()(size_t r, size_t c) const
{
return mData[r*mCols c];
}
// in place addition saves unnecessary memory allocation & copying
Mat& operator = (const Mat& m)
{
if (m.mRows != mRows || m.mCols != mCols)
throw std::runtime_error("Mat: dimensions don't match");
// since all matrix elements are contiguous in memory, we can simply to a single for loop
for (size_t i = 0; i < mData.size(); i)
mData[i] = m.mData[i];
return *this;
}
Mat operator (const Mat& m) const
{
if (m.mRows != mRows || m.mCols != mCols)
throw std::runtime_error("Mat: dimensions don't match");
// copy this Mat into a new Mat
Mat result(*this);
// add m to result in place and return result
result = m;
return result;
}
};
uj5u.com熱心網友回復:
你的記憶體管理壞了。
在您的復制建構式中,您必須復制 的內容mData,而不僅僅是指標。因此,您需要分配一個新緩沖區并將輸入資料復制到該緩沖區。
您的解構式需要 delete mData,您正在泄漏記憶體。
在您的運算子中,您不能使用默認構造矩陣作為目標。您必須使用正確的尺寸創建目標,否則它沒有分配緩沖區!
運算子的回傳值是非法的。您必須始終回傳簽名中指定的型別。你不能回傳result.mData[0],即使是在錯誤的情況下!在這種情況下,您可以回傳默認構造Mat或throw例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352049.html
上一篇:什么時候執行元類的__prepare__方法,什么使用它的回傳值?
下一篇:使用最后退出代碼0啟動bash
