重构-C++实现矩阵的简单实例

2025-05-27 0 90

重构C++实现矩阵的简单实例

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315
#include <iostream>

#include <cmath>

using namespace std;

double cofactor(double* detPtr,int rank,int t); //代数余子式

double valDet( double *detPtr, int rank); //行列式

template <class T>

void exchange(T& t1,T& t2){T temp;temp=t1;t1=t2;t2=temp;} //交换

class SquareMatrix;

class Matrix{

public:

friend class SquareMatrix; //配合转换函数食用

Matrix(){m=n=mn=0;} //默认构造函数

Matrix(int mt,int nt); //构造矩阵

Matrix(const Matrix& mtrx); //复制构造函数

Matrix(int mt,int nt,double* a); //数组初始化矩阵

Matrix transposeMtrx(); //转置矩阵

//初等变换

void exchangeRow(int r1,int r2,int c=0); //交换行

void multiRow(int r,int k,int c=0); //数乘行

void addMultiRow(int r1,int r2,int k=1,int c=0); //r1+=k*r2

void exchangeColumn(int c1,int c2,int r=0); //交换列

void multiColumn(int c,int k,int r=0); //数乘列

void addMultiColumn(int c1,int c2,int k=1,int r=0); //c1+=k*c2

Matrix& operator =(const Matrix& mtrx); //赋值构造函数

friend istream& operator>>(istream& input,Matrix& mtrx);

friend ostream& operator<<(ostream& output,Matrix& mtrx); //输出矩阵

friend Matrix operator*(Matrix& m1,Matrix& m2); //矩阵乘法

protected:

int m;

int n;

int mn;

double* matrixPtr;

};

class SquareMatrix:public Matrix{

public:

SquareMatrix():Matrix(){} //默认构造函数

SquareMatrix(int mt):Matrix(mt,mt){}; //构造函数

SquareMatrix(int mt,double* a):Matrix(mt,mt,a){}; //数组初始化方阵

SquareMatrix(const Matrix& mtrx); //矩阵到方阵转换

SquareMatrix transposeSqrMtrx(); //转置方阵

SquareMatrix adjugateSqrMatrix(); //伴随矩阵

SquareMatrix inverseSqrMatrix(); //逆矩阵

friend istream& operator>>(istream& input,SquareMatrix& mtrx);

//输入方阵

friend SquareMatrix operator *(SquareMatrix& sm1,SquareMatrix& sm2);

//方阵乘法

double getDet(); //行列式的值

private:

};

Matrix::Matrix(int mt,int nt){ //初始化m*n矩阵

m=mt;n=nt;mn=m*n;

matrixPtr=new double[mn];

}

Matrix::Matrix(const Matrix& mtrx){ //复制构造函数

m=mtrx.m;n=mtrx.n;mn=mtrx.mn;

matrixPtr=new double[mn];

for(int i=0;i<mn;i++) matrixPtr[i]=mtrx.matrixPtr[i];

}

Matrix::Matrix(int mt,int nt,double* a){ //数组初始化m*n矩阵

m=mt;n=nt;mn=m*n;

matrixPtr=new double[mn];

for(int i=0;i<mn;i++)

matrixPtr[i]=a[i];

}

istream& operator>>(istream& input,Matrix& mtrx){ //重载>>

if(!mtrx.m){

cout<<"enter the m,n of matrix:";

input>>mtrx.m>>mtrx.n;

mtrx.mn=mtrx.m*mtrx.n;

mtrx.matrixPtr=new double[mtrx.mn];

cout<<"enter the matrix:"<<endl;

}

else cout<<"enter a "<<mtrx.m<<'*'<<mtrx.n<<" matrix:"<<endl;

for(int i=0;i<mtrx.mn;i++) input>>mtrx.matrixPtr[i];

return input;

}

Matrix Matrix::transposeMtrx(){ //转置矩阵

Matrix mtrx(n,m);

for(int i=0;i<n;i++)

for(int j=0;j<m;j++)

mtrx.matrixPtr[m*i+j]=matrixPtr[n*j+i];

return mtrx;

}

void Matrix::exchangeRow(int r1,int r2,int c){ //交换行,默认c=0

for(int i=c;i<n;i++)

exchange(matrixPtr[n*r1+i],matrixPtr[n*r2+i]);

}

void Matrix::multiRow(int r,int k,int c){ //数乘行,默认c=0

for(int i=c;i<n;i++)

matrixPtr[n*r+i]*=k;

}

void Matrix::addMultiRow(int r1,int r2,int k,int c){ //r1+=k*r2,默认k=1,c=0

for(int i=c;i<n;i++)

matrixPtr[n*r1+i]+=matrixPtr[n*r2+i]*k;

}

void Matrix::exchangeColumn(int c1,int c2,int r){ //交换列,默认r=0

for(int i=r;i<m;i++)

exchange(matrixPtr[n*i+c1],matrixPtr[n*i+c2]);

}

void Matrix::multiColumn(int c,int k,int r){ //数乘列,默认k=1,r=0

for(int i=r;i<m;i++)

matrixPtr[n*i+c]*=k;

}

void Matrix::addMultiColumn(int c1,int c2,int k,int r){ //c1+=k*c2,默认r=0

for(int i=r;i<m;i++)

matrixPtr[n*i+c1]+=matrixPtr[n*i+c2]*k;

}

Matrix& Matrix::operator=(const Matrix& mtrx){ //重载=

m=mtrx.m;n=mtrx.n;mn=m*n;

matrixPtr=new double[mn];

for(int i=0;i<mn;i++) matrixPtr[i]=mtrx.matrixPtr[i];

return *this;

}

ostream& operator<<(ostream& output,Matrix& mtrx){ //重载<<

output<<endl;

for(int i=0;i<mtrx.m;i++){

for(int j=0;j<mtrx.n;j++)

output<<mtrx.matrixPtr[mtrx.n*i+j]<<' ';

output<<endl;

}

output<<endl;

return output;

}

Matrix operator *(Matrix& m1,Matrix& m2){ //重载*

Matrix m3(m1.m,m2.n);

for(int i=0;i<m3.m;i++)

for(int j=0;j<m3.n;j++){

double val=0;

for(int k=0;k<m2.m;k++)

val+=m1.matrixPtr[m1.n*i+k]*m2.matrixPtr[m2.n*k+j];

m3.matrixPtr[m3.n*i+j]=val;

}

return m3;

}

//我是萌萌哒分割线-------------------------------------------------------

SquareMatrix::SquareMatrix(const Matrix& mtrx){ //构造函数

m=n=mtrx.m;mn=m*n;matrixPtr=new double[mn];

for(int i=0;i<mn;i++) matrixPtr[i]=mtrx.matrixPtr[i];

}

istream& operator>>(istream& input,SquareMatrix& mtrx){ //重载>>

if(!mtrx.m){

cout<<"enter the m of squareMatrix:";

input>>mtrx.m;

mtrx.n=mtrx.m;mtrx.mn=mtrx.m*mtrx.n;

mtrx.matrixPtr=new double[mtrx.mn];

cout<<"enter the squareMatrix:"<<endl;

}

else cout<<"enter a "<<mtrx.m<<" order squareMatrix:"<<endl;

for(int i=0;i<mtrx.mn;i++) input>>mtrx.matrixPtr[i];

return input;

}

SquareMatrix SquareMatrix::transposeSqrMtrx(){ //转置方阵

return SquareMatrix((*this).transposeMtrx());

}

SquareMatrix SquareMatrix::adjugateSqrMatrix(){ //伴随矩阵

SquareMatrix aSM(m);

for(int i=0;i<mn;i++)

aSM.matrixPtr[i]=cofactor(matrixPtr,m,i);

aSM=aSM.transposeSqrMtrx();

return aSM;

}

SquareMatrix SquareMatrix::inverseSqrMatrix(){ //逆矩阵

double det=getDet();

if(det==0){

cerr<<"this is a singular matrix!"<<endl; //判断奇异矩阵

return 0;

}

SquareMatrix aSM(m),iSM(m);

aSM=adjugateSqrMatrix();

for(int i=0;i<mn;i++)

iSM.matrixPtr[i]=aSM.matrixPtr[i]/det;

return iSM;

}

SquareMatrix operator *(SquareMatrix& sm1,SquareMatrix& sm2){ //重载*

SquareMatrix sm3(sm1.m);

for(int i=0;i<sm3.m;i++)

for(int j=0;j<sm3.n;j++){

double val=0;

for(int k=0;k<sm2.m;k++)

val+=sm1.matrixPtr[sm1.n*i+k]*sm2.matrixPtr[sm2.n*k+j];

sm3.matrixPtr[sm3.n*i+j]=val;

}

return sm3;

}

double SquareMatrix::getDet(){ //行列式

return valDet(matrixPtr,m);

}

//又是一条萌萌哒分割线------------------------------------------

double valDet( double *detPtr, int rank)

{

double val=0;

if(rank==1) return detPtr[0];

for(int i=0;i<rank;i++) //计算余子式保存在nextDetPtr[]中

{

double *nextDetPtr=new double[(rank-1)*(rank-1)];

for(int j=0;j<rank-1;j++)

for(int k=0;k<i;k++)

nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k];

for(int j=0;j<rank-1;j++)

for(int k=i;k<rank-1;k++)

nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k+1];

val+=detPtr[i]*valDet(nextDetPtr,rank-1)*pow(-1.0,i);

}

return val;

}

double cofactor(double* detPtr,int rank,int t){ //计算代数余子式

double *nextDetPtr=new double[(rank-1)*(rank-1)];

for(int i=0,j=0;i<rank*rank;i++)

if(i>=(t/rank)*rank&&i<(t/rank)*rank+rank||!((t-i)%rank)); //如果i和t同行或同列

else{

nextDetPtr[j]=detPtr[i];

j++;

}

return valDet(nextDetPtr,rank-1)*pow(-1.0,t/rank+t%rank);

}

int main(){

cout<<endl<<"测试驱动程序-------------------"<<endl;

/*

cout<<endl<<"输入任意矩阵-------------------"<<endl;

Matrix m1;cin>>m1;cout<<m1;

cout<<endl<<"输入任意方阵-------------------"<<endl;

SquareMatrix sm1;cin>>sm1;cout<<sm1;

cout<<endl<<"输入3*2矩阵--------------------"<<endl;

Matrix m2(3,2);cin>>m2;cout<<m2;

cout<<endl<<"输入2阶方阵--------------------"<<endl;

SquareMatrix sm2(2);cin>>sm2;cout<<sm2;

*/

cout<<endl<<"数组初始化矩阵-----------------"<<endl;

double a1[6]={1,2,3,7,8,9};

Matrix m3(2,3,a1);cout<<m3;

cout<<endl<<"数组初始化方阵-----------------"<<endl;

double a2[4]={3,4,5,6};

SquareMatrix sm3(2,a2);cout<<sm3;

cout<<endl<<"复制构造方阵/矩阵--------------"<<endl;

Matrix m4;m4=m3;Matrix m5(m3);

cout<<m4<<m5;

SquareMatrix sm4;sm4=sm3;SquareMatrix sm5(sm3);

cout<<sm4<<sm5;

cout<<endl<<"矩阵/方阵乘法------------------"<<endl;

double a3[6]={1,0,3,2,1,0},a4[9]={4,1,0,-1,1,3,2,0,1};

Matrix m6(2,3,a3),m7(3,3,a4);

Matrix m8=m6*m7;cout<<m8;

double a5[4]={1,2,2,3},a6[4]={2,3,4,1};

SquareMatrix sm6(2,a5),sm7(2,a6);

SquareMatrix sm8(sm6*sm7);cout<<sm8;

cout<<endl<<"矩阵转换为方阵-----------------"<<endl;

SquareMatrix sm9(m7);cout<<m7<<sm9;

cout<<endl<<"转置矩阵/方阵------------------"<<endl;

Matrix m9(m6.transposeMtrx());

cout<<m6<<m9;

SquareMatrix sm10=sm9.transposeSqrMtrx();

cout<<sm9<<sm10;

cout<<endl<<"初等变换-----------------------"<<endl;

cout<<m3<<m4;

m4.exchangeRow(0,1,2);cout<<m3<<m4;

m4.exchangeRow(0,1);cout<<m4;

m4.exchangeColumn(0,2);cout<<m4;

m4.multiRow(1,2);cout<<m4;

m4.multiColumn(1,2,1);cout<<m4;

m4.addMultiRow(0,1);cout<<m4;

m4.addMultiColumn(0,2,2,1);cout<<m4;

cout<<sm3<<sm4;

sm4.exchangeRow(0,1);cout<<sm3<<sm4;

cout<<endl<<"方阵的行列式值-----------------"<<endl;

cout<<sm3<<sm3.getDet()<<endl;

cout<<endl<<"逆矩阵-------------------------"<<endl;

SquareMatrix sm11=sm3.inverseSqrMatrix();cout<<sm11;

SquareMatrix sm12=sm3*sm11;cout<<sm12;

return 0;

}

以上这篇重构-C++实现矩阵的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 重构-C++实现矩阵的简单实例 https://www.kuaiidc.com/75048.html

相关文章

发表评论
暂无评论