C++

Векторы

Даны векторы x и y размерности n, и квадратные матрицы А и В размерности n*n. Вычислить (Ах, Ву). Алгоритмы умножения матрицы на вектор и скалярного произведения векторов реализовать в выгляде функций.

Код C++
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <ctime>
#include <iomanip>
//////////////////////////////////////////////////////////////////////////
void out(double *a,int n);
void out(double *a,int n,int k);
void vin(double *a,int n);
void mult(double *a,double *x,int n);
void oper(double *a,double *b,double *x,double *y,int n);
//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    setlocale(0,"");
    int n;
    double *x,*y,
        *a,*b;
    cout << "Введите порядок матрицы: ";
    wcin >> n;
    _flushall();
    x = new double[n];
    y = new double[n];
    a = new double[n*n];
    b = new double[n*n];
    srand(time(0));
    oper(a,b,x,y,n);
    getchar();
    delete[]x;
    delete[]y;
    delete[]a;
    delete[]b;
    return 0;
}
//////////////////////////////////////////////////////////////////////////
void out(double *a,int n,int k)
{
    int x = n-1;
    for(int i = 0;i < n*k;i++)
    {
        cout << setprecision(3)
             << a[i] << "  ";
        if(i == x)
        {
            cout << endl;
            x += n;
        }
    }
    cout << "\n\n";
}
//////////////////////////////////////////////////////////////////////////
void out(double *a,int n)
{
    for(int i = 0; i < n;i++)
    {
        cout << setprecision(3)
             << a[i] << "  ";
    }
    cout << "\n\n";
}
//////////////////////////////////////////////////////////////////////////
void vin(double *a,int n)
{
    for(int i = 0; i < n;i++)
        a[i] = (1.0*(rand()%401-200))/11;
}
//////////////////////////////////////////////////////////////////////////
void mult(double *a,double *x,int n)
{
    int y = n-1,
        k = 0;
    for(int i = 0;i < n*n;i++)
    {
        a[i] *= x[k];
        if(i == y)
        {
            k++;
            y += n;
        }
    }
}
void oper(double *a,double *b,double *x,double *y,int n)
{
    vin(x,n);
    vin(y,n);
    vin(a,n*n);
    vin(b,n*n);
    cout << "Матрица А:" << endl;
    out(a,n,n);
    cout << "Вектор Х:" << endl;
    out(x,n);
    cout << "Матрица В:" << endl;
    out(b,n,n);
    cout << "Вектор Y:" << endl;
    out(y,n);
    mult(a,x,n);
    mult(b,y,n);
    cout << "Матрица А после умножения на вектор Х:" << endl;
    out(a,n,n);
    cout << "Матрица В после умножения на вектор Y:" << endl;
    out(b,n,n);
}


класс прямоугольных матриц
Код C++
class rmatrix
{
    
public:
    int row, col;
    double **a;
    
    rmatrix (int r=1, int c=1); 
    rmatrix (rmatrix & m);
    rmatrix (int, int, double **);
    ~rmatrix();
 
    rmatrix & operator = (rmatrix & m);
    rmatrix  operator + (rmatrix & m);
    rmatrix  operator - (rmatrix & m);
    rmatrix  operator * (rmatrix & m);
    rmatrix  operator * (double l);
    rmatrix transpose (void);
    double & operator ()(int, int);
    friend ostream & operator << (ostream & out, rmatrix & m);
    friend istream & operator >> (istream & in, rmatrix & m);
    
};
 
class sqmatrix : public rmatrix
{
public:
    sqmatrix (int);
    sqmatrix (sqmatrix &);
    sqmatrix(int, double **);
    sqmatrix minor(int, int);
    int sign(int, int);
    double det();
    sqmatrix inverse();
};
 
class vector : public rmatrix
{
    int size;
    double * w;
public: 
    vector(int);
    vector(vector &);
    vector(int, double *);
    double mod();
    double operator *(vector &);
};
 
//------------- прямоугольные матрицы-----------//
rmatrix :: rmatrix (int r, int c)
{
    a=new double * [row=r];
    for (int i=0; i<row; i++)
        a[i]=new double [col=c];
}
 
rmatrix :: rmatrix (rmatrix & m)
{
    a=new double *[row=m.row];
    for (int k=0; k<row; k++)
        a[k]=new double [col=m.col];
    for (int i=0; i<m.row; i++)
        for (int j=0; j<m.col; j++)
            a[i][j]=m(i,j);
}
rmatrix :: rmatrix (int r, int c, double **m)
{
    a= new double *[row=r];
    for (int i=0; i<row; i++)
        a[i]=new double [col=c];
    for (int i=0; i<row; i++)
        for (int j=0; j<col; j++)
            a[i][j]=m[i][j];
}
rmatrix :: ~rmatrix()
{
    for (int i=0; i<row; i++)
        delete [] a[i];
    delete [] a;
}
double & rmatrix :: operator () (int i, int j)
{
    return a[i][j];
}
 
rmatrix & rmatrix :: operator = (rmatrix & m)
{
    for (int i=0; i<row; i++)
        for (int j=0; j<col; j++)
            (*this)(i,j)=m(i,j);
    return (*this);
}
 
rmatrix rmatrix ::transpose()
{
    rmatrix temp(col, row);
    
    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
            temp(j, i)=(*this)(i, j);
    return temp;
}
 
rmatrix rmatrix :: operator + (rmatrix & m)
{
    if (row==m.row && col==m.col)
    {
        rmatrix temp(m.row, m.col);
        for (int i=0; i<m.row; i++)
            for (int j=0; j<m.col; j++)
                temp(i,j)=(*this)(i,j)+m(i,j);
        return temp;
    }
    else
    {
        cout<<"error rmatrix: operator + : razmernost' matriz ne sovpadaet!"<<endl;
        return 0;
    }
}
rmatrix rmatrix :: operator - (rmatrix & m)
{
    if (row==m.row && col==m.col)
    {
        rmatrix temp(row,col);
        for (int i=0; i<m.row; i++)
            for (int j=0; j<m.col; j++)
                temp(i,j)=(*this)(i,j)-m(i,j);
        return temp;
    }
    else
    {
        cout<<"error rmatrix: operator - : razmernost' matriz ne sovpadaet!"<<endl;
        return 0;
    }
}
rmatrix rmatrix :: operator * (rmatrix & m)
{
    if (col==m.row)
    {
        rmatrix temp(row, m.col);
        for (int i=0; i<row; i++)
            for (int j=0; j<m.col; j++)
            {
                temp(i,j)=0.0;
                for (int k=0; k<col; k++)
                    temp(i,j)+=(*this)(i,k)*m(k,j);
            }
        return temp;
    }
    else
    {
        cout<<"error rmatrix: operator * : oshibka v razmernosti matriz"<<endl;
        return 0;
    }
}
 
rmatrix rmatrix :: operator * (double l)
{
    rmatrix temp(row,col);
    for (int i=0; i<row; i++)
        for (int j=0; j<col; j++)
            temp(i,j)=(*this)(i,j)*l;
    return temp;
}
 
ostream & operator << (ostream & out, rmatrix & m)
{
    for (int i=0; i<m.row; i++)
    {
        for (int j=0; j<m.col; j++)
        {
            out.width(5);
            out << m(i,j);
        }
        out << endl;
    }
    return out;
}
 
istream & operator >> (istream & in, rmatrix & m)
{
    for (int i=0; i<m.row; i++)
    for (int j=0; j<m.col; j++)
        in >> m(i,j);
    return in;
}
 
//---------------- квадратные матрицы -------------------//
 
sqmatrix :: sqmatrix(int row):rmatrix(row, row) {;}
 
sqmatrix :: sqmatrix(sqmatrix & m): rmatrix(m)
{
    row=m.row;
    a=new double * [row];
    for(int i=0;i<col;i++)
        a[i]=new double [row];
}
 
sqmatrix :: sqmatrix(int r, double **m):rmatrix(r, r, m) {;}
 
sqmatrix sqmatrix :: minor(int i, int j)
{
    sqmatrix temp(row-1);
    for(int k=0;k<row-1;k++)
        for(int l=0;l<row-1;l++)
            temp(k, l)=(*this)(k<i ? k:k+1, l<j ? l:l+1);
    
    return sqmatrix(row-1, temp.a);
}
 
int sqmatrix :: sign(int i, int j)
{
    return ((i+j)%2 == 0) ? 1:-1;
}
 
double sqmatrix :: det()
{
    double d;
    if(row==1)
        return (*this)(0, 0);
    else
    {
        d=0.0;
        for(int i=0;i<row;i++)
            d+=sign(0, i)*(*this)(0, i)*minor(0, i).det();
    }
    return d;
}
    
sqmatrix sqmatrix ::inverse()
{
    double d=(*this).det();
    sqmatrix t(row);
    if(d==0)
    {
        cout<<"det=0, obratnoi matrici ne sushestvuet!"<<endl;
        exit(1);
    }
    else
    {       
        for(int i=0;i<row;i++)
            for(int j=0;j<row;j++)
                t(j, i)=sign(i, j)*minor(i, j).det()/d;
    }
    return sqmatrix(row, t.a);
}
 
//------------------- класс вектор -------------------------//
 
vector :: vector(int s):rmatrix(1, s){col=s;}
 
vector :: vector(vector & v):rmatrix(v)
{
    col=v.size;
    w=new double[size];
}
 
vector :: vector(int s, double * mas):rmatrix(1, s, &mas) {col=s;}
 
double vector :: mod()
{
    double d=0.0;
    for(int i=0;i<(*this).col;i++)
        d+=(*this)(0, i)*(*this)(0,  i);        
    return sqrt(d);
}
 
double vector :: operator *(vector & v)
{
    double res=0.0;
    if((*this).col != v.col)
    {
        cout<<"error: vector: skaljarnoe pr. : oshibka v razmere"<<endl;
        exit(1);
    }
    else
    {
        for(int i=0;i<(*this).col;i++)
            res+=(*this)(0, i)*v(0, i);
    }
    return res;
}


// функция умножения матрицы на вектор
// n,m - количество строк, столбцов матрицы соответственно 
// вектор имеет размерность m
void matrvect( int n, int m, int **matr, int *vect, int *res)
{
    for (int i=0; i<n; i++){
    int sum=0;
        for (int j=0; j<m; j++){
            sum=sum + matr[i][j] * vect[j];
        }
    res[i]=sum; //
    }
}
Теги:
Матрица
Похожие новости:
Добавлено: 28 Сентября 2013 07:44:24 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...