Организация математических операций в С++Рефераты >> Программирование и компьютеры >> Организация математических операций в С++
{
Matrix<VARTYPE> C=A;
for(int i=0,j; i<A.m; i++)
for(j=0; j<A.n; j++)
C(i,j)+=B(i,j);
return C;
}
template <class VARTYPE>
Matrix<VARTYPE> operator-(const Matrix<VARTYPE> &A, const Matrix<VARTYPE> &B)
{
Matrix<VARTYPE> C=A;
for(int i=0, j; i<A.m; i++)
for(j=0;j<A.n;j++)
C(i,j)-=B(i,j);
return C;
}
template <class VARTYPE>
Matrix<VARTYPE> operator*(const Matrix<VARTYPE> &A,const Matrix<VARTYPE> &B)
{
Matrix<VARTYPE> C(A.m,B.n);
if (A.n!=B.m)
{
if(A.m==3 && A.n==1 && B.m==3 && B.n==1)
{
C(0)=A(1)*B(2)-A(2)*B(1);
C(1)=A(2)*B(0)-A(0)*B(2);
C(2)=A(0)*B(1)-A(1)*B(0);
}
else
A.ERROR_MATRIX(2);
}
else
{
for(int i=0,j,k;i<C.m;i++)
for(j=0;j<C.n;j++)
for(k=0;k<A.n;k++)
C(i,j)+=A(i,k)*B(k,j);
}
return C;
}
template <class VARTYPE>//умножение числа на матрицу
Matrix<VARTYPE> operator*(const double &f,const Matrix<VARTYPE> &A)
{
Matrix<VARTYPE> B=A;
for(int i=0,j;i<A.m;i++)
for(j=0;j<A.n;j++)
B(i,j)*=f;
return B;
}
template <class VARTYPE>// умножение матрицы на число
Matrix<VARTYPE> operator*(const Matrix<VARTYPE> &A, const double &f)
{
Matrix<VARTYPE> B=A;
for(int i=0,j;i<A.m;i++)
for(j=0;j<A.n;j++)
B(i,j)*=f;
return B;
}
template <class VARTYPE>
Matrix<VARTYPE>& Matrix<VARTYPE>::newsize(dim M, dim N)
{ delete [] matr;
m=M;
n=N;
if (N && M) { matr=new VARTYPE[m*n];
if (!matr) ERROR_MATRIX(1);
setmem(matr,sizeof(VARTYPE)*m*n,0); }
else { m=n=0; matr=(VARTYPE*)0; }
return *this;
}
template <class VARTYPE>
ostream& operator<<(ostream &out,Matrix<VARTYPE> &A)
{ for(int i=0,j;i<A.size_row();i++)
{ for(j=0;j<A.size_col();j++)
out << A(i,j)<< " ";
out<<endl;
}
return out;
}
template <class VARTYPE>
int operator>>(istream &inp,Matrix<VARTYPE> &A)
{ for(int i=0,j;i<A.size_row();i++)
for(j=0;j<A.size_col();j++) if( !(inp>>A(i,j)) ) return 1;
return 0;
}
template <class VARTYPE>
void Matrix<VARTYPE>::swap_line(dim L1, dim L2)
{
if (L1==L2)
return;
double b;
for(int j=0;j<n;j++)
{
b=(*this)(L1,j);
(*this)(L1,j)=(*this)(L2,j);
(*this)(L2,j)=b;
}
}
template <class VARTYPE>
void Matrix<VARTYPE>::swap_column(dim C1, dim C2)
{
if (C1==C2)
return;
double b;
for(int i=0;i<m;i++)
{
b=(*this)(i,C1);
(*this)(i,C1)=(*this)(i,C2);
(*this)(i,C2)=b;
}
}
template <class VARTYPE>
dim Matrix<VARTYPE>::read(ifstream &finp)
{ (finp.get(m)).get(n); delete []matr; matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
setmem(matr,sizeof(VARTYPE)*m*n,0);
finp.read((char *)matr,sizeof(VARTYPE)*m*n); return finp.fail();
}
template <class VARTYPE>
dim Matrix<VARTYPE>::write(ofstream &fout)
{ (fout.put(m)).put(n);
(fout.write((char *)matr,sizeof(VARTYPE)*m*n))<<flush; return fout.fail();
}
template <class VARTYPE>
VARTYPE operator%(const Matrix<VARTYPE> &A, const Matrix<VARTYPE>&B)
{
if(A.n!=1 || B.n!=1) A.ERROR_MATRIX(9);
if(A.m!=B.m) A.ERROR_MATRIX(0);
VARTYPE scalarmul = 0;
for(int i=0; i<A.m; i++)
scalarmul = scalarmul+A(i)*B(i);
return scalarmul;
}
template <class VARTYPE>
void Matrix<VARTYPE>::ERROR_MATRIX(dim E) const
{ static char *message[] = {
"Матрицы должны иметь одинаковую размерность", //0
"Не выделена память!", //1
"Матрицы не согласованы для умножения", //2
"Степень должна быть больше нуля или -1", //3
"Матрица должна быть квадратной", //4
"Нулевой ведущий элемент в преобразовании Гаусса", //5
"Вставка невозможна из-за перекрытия базовой матрицы", //6
"Извлекаемая матрица выходит за границы базовой", //7
"Выход за границы. Попытка доступа к несущ. элементу", //8
"Это не вектор!"}; //9
cerr<<"ERROR: "<< message[E] << endl; exit(1);
}
Демонстративно - тестирующая программа:
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
#include "tmatr.cpp"
int main()
{
clrscr();
Matrix<double> A(3,3), B(3,3), C(3,3);
Matrix<double> V(3),X(3),H(3),U(3);
double d;
A(0,0)=1.1; A(0,1)=2.2; A(0,2)=3.3;
A(1,0)=2.4; A(1,1)=1.1; A(1,2)=4.4;
A(2,0)=1.3; A(2,1)=2.1; A(2,2)=4.1;
B(0,0)=2; B(0,1)=7; B(0,2)=2;
B(1,0)=4; B(1,1)=8; B(1,2)=1;
B(2,0)=6; B(2,1)=4; B(2,2)=1;
V(0)=2.1; V(1)=3.31; V(2)=1.4;
H(0)=1.1; H(1)=2.1; H(2)=3.1;
//******************************
C=A+B;
cout<<"A:\n"<<A<<endl;
cout<<"B:\n"<<B<<endl;
cout<<"C=A+B:\n"<<C<<endl;
cout<<"Press any key .\n";
getch();
clrscr();
//******************************
C=A-B;
cout<<"A:\n"<<A<<endl;
cout<<"B:\n"<<B<<endl;
cout<<"C=A-B:\n"<<C<<endl;
cout<<"Press any key .\n";
getch();
clrscr();
//******************************
//******************************
X=V+H;
cout<<"V:\n"<<V<<endl;
cout<<"H:\n"<<H<<endl;
cout<<"X=V+H:\n"<<X<<endl;
cout<<"Press any key .\n";
getch();
clrscr();
//******************************
X=V-H;
cout<<"V:\n"<<V<<endl;
cout<<"H:\n"<<H<<endl;
cout<<"X=V-H:\n"<<X<<endl;
cout<<"Press any key .\n";
getch();
clrscr();
C=A*V;
cout<<"A:\n"<<A<<endl;
cout<<"V:\n"<<V<<endl;
cout<<"C=A*V:\n"<<C<<endl;
cout<<"Press any key .\n";
getch();
clrscr();
//******************************
Matrix<int> D(3,3), E(3,3);
D(0,0)=1; D(0,1)=2; D(0,2)=3;
D(1,0)=2; D(1,1)=5; D(1,2)=6;
D(2,0)=7; D(2,1)=3; D(2,2)=9;