Я перегрузил операторы * и =. Ниже приведен листинг:
| Код | OpMtr & OpMtr::operator = (const OpMtr &b) { int i,j; if (size1!=b.size1 || size2!=b.size2){ if (b.size1>0 && b.size2>0) delete [] a; size1=b.size1; size2=b.size2; a=new double[size1*size2]; } for(i=0;i<size1;i++){ for(j=0;j<size2;j++) a[i*size2+j]=b.a[i*size2+j]; } return *this; }
OpMtr OpMtr::operator * (const OpMtr &b) { int i,j,k; double s; OpMtr rab(size1,b.size2); if(size2!=b.size1) return; else { for(i=0;i<size1;i++) for(j=0;j<b.size2;j++){ for(s=0,k=0;k<size2;k++) s+=a[i*size2+k]*b.a[k*b.size2+j]; rab.a[i*b.size2+j]=s; } } return rab; }
|
Также имеется метод возведения матрицы в степень:
| Код | void OpMtr::stepen(int st) { int i, j, e=1, k; double *c, s, *b; c=new double[size1*size2]; b=new double[size1*size2]; for (i=0; i<size1*size2; i++) b[i]=a[i]; if (size1==size2) { while (e<st) { for(i=0; i<size2; i++) { for(j=0; j<size2; j++) { for (s=0,k=0; k<size2; k++) s+=a[i*size2+k]*b[k*size2+j]; c[i*size2+j]=s; } } for (i=0; i<size1*size2; i++) b[i]=c[i]; e++; } } else { delete [] b; delete [] c; return; } for (i=0; i<size1*size2; i++) a[i]=c[i]; delete [] b; delete [] c; }
|
Как можно использовать перегруженные операторы в данном методе, чтобы не повторять одних и тех же действий(перемножение матриц). Как известно матрица умножается сама на себя, тем самым возводится в степень. |