【发布时间】:2025-12-01 16:45:01
【问题描述】:
我想在构造函数中为矩阵动态分配内存。我希望 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];
}
};
我想继续这个想法,但我不确定我错过了什么
【问题讨论】:
-
注意应该是
mData[r*mCols+c]而不是r*c+c。 -
@MarcStevens 谢谢,现在 getter 和 setter 工作得很好。但是我怎样才能正确完成运算符 + * 和 ^ ?提前致谢。
-
您可以通过将 mData 更改为 std::vector
来简化您自己的内存管理。然后运算符 +、*、^ 可以简单地遍历向量元素: for (size_t i = 0; i < result.mData.size(); ++i) result.mData[i] = src1.mData[i] + src2.mData[i];。我们可以将第一行和列的双循环简化为所有元素的单循环,因为所有矩阵元素在内存中都是连续的。 -
不清楚你想用运算符 ^ 做什么,你的意思是常规矩阵矩阵乘法,其中 m x n 矩阵乘以 n x k 矩阵并产生 m x k 矩阵?而不是简单的元素明智。
标签: c++ class matrix heap-memory