Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шабл.класс "Матрица".Помогите сделать пожалуйста! 
V
    Опции темы
bronislav
Дата 6.6.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Класс matrix описывает одну матрицу, а для работы с несколькими матрицами создается несколько экземпляров класса.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
yorgan
Дата 6.6.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Как?
Не могу понять в чем именно ошибка... ООП практически не знаю :(
PM MAIL   Вверх
bronislav
Дата 6.6.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Цитата(yorgan @  6.6.2008,  09:29 Найти цитируемый пост)
T** a, b, c; // массив элементов матриц

Зачем в классе 3 массива для матриц? Вам надо использовать 3 матрицы?

Тогда переопределяем оператор умножения для класса matrix и умножаем матрицы так:

Код

matrix a(5), b(5), c(5);
cin >> a >> b;
c = a * b;



--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
yorgan
Дата 6.6.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Это все, что не правильно в коде?
Матрицы три, т.к. нужно разные действия делать: умножать 2 матрицы друг на друга, результат помещать в третью.
А как переопределить оператор умножения?
PM MAIL   Вверх
bronislav
Дата 6.6.2008, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Вообще-то не мешало бы воспользоваться поиском на тему "Перегрузка операций"

И можно посмотреть тут.

Это сообщение отредактировал(а) bronislav - 6.6.2008, 10:54


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
yorgan
Дата 6.6.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



времени уже нету. Через 40 минут нужно  уже выезжать в универ :(
P.s. в коде больше ошибок\неточностей нету?
PM MAIL   Вверх
bronislav
Дата 6.6.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Цитата(yorgan @  6.6.2008,  09:49 Найти цитируемый пост)
Это все, что не правильно в коде?


Ну по аналогии с умножение надо переделать функции ввода и др.

Добавлено через 1 минуту и 24 секунды
Цитата(yorgan @  6.6.2008,  09:55 Найти цитируемый пост)
времени уже нету. Через 40 минут нужно  уже выезжать в универ :(

Оно компилируется? Значит работает, но будь готов к тому, что преподаватель отрицательно отреагирует на такой код.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
yorgan
Дата 6.6.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Не компилится :(
Ругается на переменную i в каждой функции - типа много раз она уже объявлена.
А вот обращение по [][] к элементу матрицы - преподаватлеь имел ввиду просто написать функцию, которая будет выводить элементы матрицы по указанным i и j или нужно переопределять операцию [][] ???? 
PM MAIL   Вверх
bsa
Дата 6.6.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Я бы порекомендовал в качестве параметров шаблона задавать еще и размерность матрицы:
Код
template<unsigned cols = 3, unsigned rows = 3, typename Type = double>
class Matrix
{
public:
   Matrix();
protected:
   Type data[cols][rows];
};
Недостатки:
1. автоматические матрицы занимают много места в стеке (а зачем много автоматических матриц?)
Преимущества:
1. высокая скорость создания объекта
2. не надо заморачиваться с конструктором копирования
3. высокая скорость доступа к элементам (компилятор генерирует код оптимизированный под конкретные значения размерностей)
4. возможность написания легко оптимизируемых алгоритмов расчета определителя
5. возможность организации на стадии компиляции проверки на корректность арифметических операций (т.е. нельзя перемножить матрицу 4x4 на 3x3), как-то так:
Код
template<unsigned cols, unsigned rows, unsigned cols2, typename Type>
Matrix<cols2, rows, Type> operator*(const Matrix<cols, rows, Type>&m1, const Matrix<cols2, cols, Type> &m2)
{
    Matrix<cols2, rows, Type> result;
    ....
    return result;
}

PM   Вверх
bronislav
Дата 6.6.2008, 12:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Цитата(bsa @  6.6.2008,  10:06 Найти цитируемый пост)
Я бы порекомендовал в качестве параметров шаблона задавать еще и размерность матрицы:

 smile Мда, а я и не знал, что в качестве параметров шаблона можно задавать числа. =(

Это сообщение отредактировал(а) bronislav - 6.6.2008, 12:27


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
andrew_121
Дата 6.6.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



yorgan: То что ты навоял - работает?
На всякий случай держи вот этот шаблон.
Сам юзаю в проекте по разложению звука на спектр.

Код

template<typename T, typename SliceType = std::slice> class CSlice_iter {
public:

    CSlice_iter( std::valarray<T>* vv, SliceType ss )
        :mValarray( vv ), mSlice( ss ), mCurrIdx( 0 )
    {
    }

    CSlice_iter end() {
        CSlice_iter    t = *this;
        t.mCurrIdx = mValarray.size();
        return t;
    }

    CSlice_iter& operator++() {
        mCurrIdx++;
        return *this;
    }

    CSlice_iter operator++( int ) {
        CSlice_iter    t = *this;
        mCurrIdx++;
        return t;
    }

    T operator[]( unsigned int idx ) {
        return ref( mCurrIdx = idx );
    }

    T operator()( unsigned int idx ) {
        return ref( mCurrIdx = idx );
    }

    T operator *() {
        return ref( mCurrIdx );
    }


private:

    std::valarray<T>* mValarray;
    SliceType            mSlice;
    unsigned int        mCurrIdx; // index of current element

    inline T& ref( unsigned int i ) const {
        return ( *mValarray )[mSlice.start() + i * mSlice.stride()];
    }
};

template<typename T, typename SliceType> bool operator==( const CSlice_iter<T, SliceType>& p, const CSlice_iter<T, SliceType>& q ) {
    return p.mCurrIdx == q.mCurrIdx && p.s.stride() == q.s.stride() && p.s.start() == q.s.start();
}

template<typename T, typename SliceType> bool operator!=( const CSlice_iter<T, SliceType>& p, const CSlice_iter<T, SliceType>& q ) {
    return !( p == q );
}

template<typename T, typename SliceType> bool operator<( const CSlice_iter<T, SliceType>& p, const CSlice_iter<T, SliceType>& q ) {
    return p.curr < q.curr && p.s.stride() == q.s.stride() && p.s.start() == q.s.start();
}

/***************************************************************************/

template<typename T, typename SliceType = std::slice> class Slice_iter {
public:

    Slice_iter( std::valarray<T>* vv, SliceType ss )
        :mValarray( vv ), mSlice( ss ), mCurrIdx( 0 )
    {
    }

    Slice_iter end() {
        Slice_iter    t = *this;
        t.mCurrIdx = mValarray.size();
        return t;
    }

    Slice_iter& operator++() {
        mCurrIdx++;
        return *this;
    }

    Slice_iter operator++( int ) {
        Slice_iter    t = *this;
        mCurrIdx++;
        return t;
    }

    T& operator[]( unsigned int idx ) {
        return ref( mCurrIdx = idx );
    }

    T& operator()( unsigned int idx ) {
        return ref( mCurrIdx = idx );
    }

    T& operator *() {
        return ref( mCurrIdx );
    }


private:

    std::valarray<T>* mValarray;
    SliceType            mSlice;
    unsigned int        mCurrIdx; // index of current element

    inline T& ref( unsigned int i ) const {
        return ( *mValarray )[mSlice.start() + i * mSlice.stride()];
    }
};

template<typename T, typename SliceType> bool operator==( const Slice_iter<T, SliceType>& p, const Slice_iter<T, SliceType>& q ) {
    return p.mCurrIdx == q.mCurrIdx && p.s.stride() == q.s.stride() && p.s.start() == q.s.start();
}

template<typename T, typename SliceType> bool operator!=( const Slice_iter<T, SliceType>& p, const Slice_iter<T, SliceType>& q ) {
    return !( p == q );
}

template<typename T, typename SliceType> bool operator<( const Slice_iter<T, SliceType>& p, const Slice_iter<T, SliceType>& q ) {
    return p.curr < q.curr && p.s.stride() == q.s.stride() && p.s.start() == q.s.start();
}

/***************************************************************************/

template<typename T> class Matrix {
    std::valarray<T>* pData;
    unsigned int        mdim1;
    unsigned int        mdim2;

public:

    Matrix( unsigned int x, unsigned int y ) {
        mdim1 = x;
        mdim2 = y;

        pData = new std::valarray<T>( x * y );
    }

    Matrix( const Matrix& m );

    Matrix& operator=( const Matrix& m );

    ~Matrix() {
        delete pData;
    }

    unsigned int size() const {
        return mdim1 * mdim2;
    }

    unsigned int dim1() const {
        return mdim1;
    }

    unsigned int dim2() const {
        return mdim2;
    }

    inline T& operator()( unsigned int i, unsigned int j ) {
        return row( i )[j];
    }

    inline T operator()( unsigned int i, unsigned int j ) const {
        return row( i )[j];
    }


    inline Slice_iter<T> row( unsigned int i ) {
        return Slice_iter<T>( pData, std::slice( i * mdim2, mdim2, 1 ) );
    }

    inline CSlice_iter<T> row( unsigned int i ) const {
        return CSlice_iter<T>( pData, std::slice( i * mdim2, mdim2, 1 ) );
    }

    inline Slice_iter<T> column( unsigned int j ) {
        return Slice_iter<T>( pData, std::slice( j, mdim1, mdim2 ) );
    }

    inline CSlice_iter<T> column( unsigned int j ) const {
        return CSlice_iter<T>( pData, std::slice( j, mdim1, mdim2 ) );
    }

    Slice_iter<T> operator[]( unsigned int i ) {
        return row( i );
    }

    CSlice_iter<T> operator[]( unsigned int i ) const {
        return row( i );
    }

    Matrix& operator *( T d ) {
        ( *pData ) *= d;

        return *this;
    }

    inline std::valarray<T> operator *( const std::valarray<T>& v ) {
        std::valarray<T>    res( dim1() );

        for ( int i = 0; i < dim1(); i++ ) {
            res( i ) = mul( row( i ), v );
        }

        return res;
    }



    std::valarray<T>& array() {
        return *pData;
    }

private:

    inline T mul( const std::valarray<T>& v1, const std::valarray<T>& v2 ) {
        T    res = 0;

        for ( int i = 0; i < v1.size(); i++ ) {
            res += v1[i] * v2[i];
        }

        return res;
    }
};



Так как шаблон выдран из проекта, возможны ошибки компиляции. Думаю ты разберешся...

Удачи.

Это сообщение отредактировал(а) andrew_121 - 6.6.2008, 15:07

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  matrix.h 5,11 Kb


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 6.6.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Да, и еще...
Остальной функционал набросай сам. Методы все есть, теории в инете то же.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
yorgan
Дата 8.6.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Спасибо за помощь. Буду разбираться (нужно переопределить еще операцию умножения - для умножения матриц и взятие элемента через операцию [][] )
Преподватель спросил: а можно ли этот файл ( шаблонный класс "матрица") сделать библиотекой? Если нельзя, то почему?

Это сообщение отредактировал(а) yorgan - 8.6.2008, 14:15
PM MAIL   Вверх
bronislav
Дата 8.6.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Для каждого набора аргументов шаблона на этапе компиляции содается свой класс, который уже и обрабатывается компилятором.

Библиотекой сделать можно, НО при условии его не доступности вне библиотеки. Т.е. использование только для внутренних нужд.

Возможно ошибаюсь.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
yorgan
  Дата 8.6.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Вот код:

Код

#include <stdlib.h>
#include <mem.h>    // для setmem()
#include <fstream.h>
#include <math.h>
typedef unsigned char dim;
template <class VARTYPE> class Matrix {
typedef Matrix Vector;
private:
VARTYPE *matr;     // указатель на массив матрицы
dim m,n;                    // размеры матрицы
public:
// конструкторы и деструкторы:
Matrix() { matr=(VARTYPE*)0; m=n=0; }
Matrix(dim,dim=1); // Обычный конструктор
Matrix(const Matrix<VARTYPE>&); // Конструктор копирования
~Matrix() { delete [ ]matr; }
// доступ к элементам матрицы
dim size_row() { return m; }  // число строк
dim size_col() { return n; }     // число столбцов
VARTYPE& operator() (dim x) const { return (*this)(x,0); } // элементу
// перегруженные операции и функции:
Matrix<VARTYPE>& operator=(const Matrix<VARTYPE>&);
Matrix<VARTYPE>& operator=(const VARTYPE&);
Matrix<VARTYPE> operator^(int);   // возведение в степень
Matrix<VARTYPE> operator!();      // транспонирование
VARTYPE determ();   // определитель матрицы
VARTYPE vmodul();   // модуль вектора
Matrix& Gauss(dim,dim); // преобразование по Гауссу
// (для получ. обратной и единичной матрицы)
// (для получ. верхнетреугольной матрицы)
Matrix  minor(dim,dim);  // возвращает указ. минор матрицы
Vector  line(dim i)       // возвращает вектор-строку матрицы
{ return extract(1,n,i,0); }
Vector  column(dim j)     // возвращает вектор-столбец матрицы
{ return extract(m,1,0,j); }
VARTYPE& operator() (dim,dim) const;
// доступ к
Matrix<VARTYPE>& operator<<=(const Matrix &A) { return newsize(A.m,A.n)=A; }
// безусловное приравнивание матриц
Matrix<VARTYPE>& insert(const Matrix&, dim=0, dim=0);
// вставить часть матрицы
Matrix<VARTYPE> extract(dim, dim, dim=0, dim=0);                      //извлечь часть матрицы
Matrix<VARTYPE>& newsize(dim, dim=1);                         //установить новые размеры
void swap_line(dim, dim);
//обмен строками матрицы
void swap_column(dim, dim);
// обмен столбцами матрицы
friend Matrix<VARTYPE> operator+(const Matrix<VARTYPE>&,const Matrix<VARTYPE>&);   //A-B
friend Matrix<VARTYPE> operator-(const Matrix<VARTYPE>&,const
Matrix<VARTYPE>&);    //A-B
friend Matrix<VARTYPE> operator*(const Matrix<VARTYPE>&,const Matrix<VARTYPE>&);   //A*B
friend Matrix operator*(const double&,const Matrix<VARTYPE>&);  //k*A
friend Matrix operator*(const Matrix<VARTYPE>&, const double&); //A*k
friend ostream& operator<<(ostream&,Matrix<VARTYPE>&);// потоковый вывод матрицы
friend int operator>>(istream&,Matrix<VARTYPE>&);// потоковый ввод существ. матрицы
// 0 - без. ошибок, 1 - была ошибка
dim read(ifstream&);   // файловое чтение и запись матрицы
dim write(ofstream&);            // в ее внутреннем, двоичном представлении.
friend VARTYPE operator %(const Matrix<VARTYPE>&,const Matrix<VARTYPE>&);
//Функция ошибок
void ERROR_MATRIX(dim) const;
};
// Реализация класса матриц
template <class VARTYPE>
Matrix<VARTYPE>::Matrix(dim M, dim N)
{
m=M;
n=N;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
setmem(matr,sizeof(VARTYPE)*m*n,0);
}
template <class VARTYPE>
Matrix<VARTYPE>::Matrix(const Matrix<VARTYPE> &M_Obj)  //Конструктор копирования
{
m=M_Obj.m;
n=M_Obj.n;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
movmem(M_Obj.matr, matr, sizeof(VARTYPE)*m*n);
}
template <class VARTYPE>
Matrix<VARTYPE>& Matrix<VARTYPE>::operator=(const Matrix<VARTYPE> &M_Obj)
{
m=M_Obj.m;
n=M_Obj.n;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
movmem(M_Obj.matr,matr,sizeof(VARTYPE)*m*n);
return *this;
}
template <class VARTYPE>
Matrix<VARTYPE>& Matrix<VARTYPE>::operator=(const VARTYPE &f)
{
for(int i=0,j;i<m;i++) for(j=0;j<n;j++)
if(i==j) (*this)(i,j)=f;
else (*this)(i,j)=0;
return *this;
}
template <class VARTYPE>
Matrix<VARTYPE> Matrix<VARTYPE>::operator^(int q) // Степень
{
if (q>0)
{
for(Matrix M=*this; q>1; q--)
M=M*(*this);
return M;
}
if (q!=-1) ERROR_MATRIX(3);
// вычисление обратной метoдом преобразований Гаусса
if (n!=m)  ERROR_MATRIX(4);
Matrix M(m,2*n);
M.insert(*this);
for(int i=0;i<M.m;i++)
M(i,i+M.m)=1;
for(i=0;i<M.m;i++)
M.Gauss(i,i);
return M.extract(M.m,M.m,0,M.m);
}
template <class VARTYPE>
Matrix<VARTYPE> Matrix<VARTYPE>::operator!()  // Транспозиция
{ Matrix<VARTYPE> A(n,m);
for(int i=0, j; i<m; i++)
for(j=0; j<n; j++)
A(j,i)=(*this)(i,j);
return A;
}
template <class VARTYPE>
VARTYPE Matrix<VARTYPE>::determ() // рекурсивно находит определитель матрицы
{
if (n!=m) ERROR_MATRIX(4);
if (n==1)
return (*this)(0,0);
for(int i=0; i<m; i++)
if ((*this)(i,0))
{
static Matrix<VARTYPE> M;
M <<= *this;
VARTYPE d=M(i,0)*(i%2?-1:1);
return d*M.Gauss(i,0).minor(i,0).determ();
}
return 0.0;
}
template <class VARTYPE>
VARTYPE Matrix<VARTYPE>::vmodul()      // Модуль вектора
{
VARTYPE d=0;
if (n!=1) ERROR_MATRIX(9);
static Matrix<VARTYPE> M;
M <<= *this;
for(int i=0; i<m; i++)
d=d+M(i,0)*M(i,0);
return sqrt(d);
}
template <class VARTYPE>
Matrix<VARTYPE>& Matrix<VARTYPE>::Gauss(dim M, dim N)
{
Matrix<VARTYPE>& A=*this;
if (!A(M,N))  ERROR_MATRIX(5);
for(int i=0,j;i<m;i++)
for(j=0;j<n;j++)
if (i!=M && j!=N)
A(i,j)-=A(M,j)*A(i,N)/A(M,N);
for(j=0;j<n;j++)
if (j!=N)
A(M,j)/=A(M,N);
for(i=0;i<m;i++)
A(i,N)=0;
A(M,N)=1;
return *this;
}
template <class VARTYPE>
Matrix<VARTYPE> Matrix<VARTYPE>::minor(dim M, dim N)         // возвращ. матрицу без
{
// строки y и столбца x
Matrix<VARTYPE> A(m-1,n-1);
for(int i=0,in=0,j,jn;i<m;i++)
if (i!=M)
{
for(j=0,jn=0;j<n;j++)
if (j!=N)
A(in,jn++)=(*this)(i,j);
in++;
}
return A;
}
template <class VARTYPE>   // вставка
Matrix<VARTYPE>& Matrix<VARTYPE>::insert(const Matrix<VARTYPE> &A, dim M, dim N)
{
if (M+A.m>m || N+A.n>n)  ERROR_MATRIX(6);
for(int i=0, j; i<A.m; i++)
for(j=0; j<A.n; j++)
(*this)(i+M,j+N)=A(i,j);
return *this;
}
template <class VARTYPE>   // извлечение
Matrix<VARTYPE> Matrix<VARTYPE>::extract(dim LM, dim LN, dim M, dim N)
{
if (M+LM>m || N+LN>n)  ERROR_MATRIX(7);
Matrix<VARTYPE> A(LM,LN);
for(int i=0, j; i<LM; i++)
for(j=0; j<LN; j++)
A(i,j)=(*this)(i+M,j+N);
return A;
}
template <class VARTYPE>
VARTYPE& Matrix<VARTYPE>::operator() (dim M, dim N) const
{ return *(matr+n*M+N); }
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;
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);
}


Вопрос по прежнему актуален. Можно ли сделать из него библиотеку matrix.lib ?
А можно сделать из этого кода хеадер-файл matrix.h и уже из matrix.h и matrix.срр (где main) сделать matrix.lib?
Кстати, а как делать библиотеку в Вижуал Студио 2005?

Это сообщение отредактировал(а) yorgan - 8.6.2008, 21:06
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1302 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.