Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2013, 22:09   #1
darklagger
 
Регистрация: 31.07.2010
Сообщений: 7
По умолчанию Класс матрица

Здравствуйте. У меня есть класс матрицы:

Код:
#pragma once
#ifndef classMatrix_h
#define classMatrix_h
 
#include <iostream>
 
using std::istream;
using std::ostream;
 
class Matrix
{
    //classes for exception handling
    class IrrelevantSizes { };
    class NonexistentElement { };
 
    //input the matrix
    friend istream& operator>>(istream& in, Matrix& mat);
    //output the  matrix
    friend ostream& operator<<(ostream& out, const Matrix& mat);
private:
    double** a;
    int row, col;
public:
    //constructor of a matrix with certain sizes
    Matrix(int amount_of_row, int amount_of_col);
    //copy constructor
    Matrix(const Matrix& mat);
    //empty matrix
    Matrix();
 
    //destructor
    ~Matrix();
 
    //get sizes of the matrix
    int getAmountOfRows() const;
    int getAmountOfColumns() const;
 
    //get element
    double& element(int row_i, int col_j);
 
    //assignment
    void operator=(const Matrix& mat);
 
    //equals operator
    bool operator==(const Matrix& mat) const;
    //not equal operator
    bool operator!=(const Matrix& mat) const;
 
    //addition operator
    Matrix operator+(const Matrix& mat) const;
    //subtraction operator
    Matrix operator-(const Matrix& mat) const;
    //multiplication operator
    Matrix operator*(const Matrix& mat) const;
    Matrix operator*(double num) const;
};
 
#endif
Как сюда встроить нахождение определителя?
darklagger вне форума Ответить с цитированием
Старый 18.03.2013, 05:43   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

А спросить у того, кто писал? Или, наконец-то, чт-то по классам прочитать?

По теме: абсолютно также, как и другие функции из этого примера.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 18.03.2013, 18:36   #3
darklagger
 
Регистрация: 31.07.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Ezhik Kihze Посмотреть сообщение
А спросить у того, кто писал? Или, наконец-то, чт-то по классам прочитать?

По теме: абсолютно также, как и другие функции из этого примера.
иди в жопу
darklagger вне форума Ответить с цитированием
Старый 18.03.2013, 18:39   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
иди в жопу
двойка тебе за поведение. Завтра в школу с родителями )
rrrFer вне форума Ответить с цитированием
Старый 18.03.2013, 18:44   #5
darklagger
 
Регистрация: 31.07.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
двойка тебе за поведение. Завтра в школу с родителями )
и тебя в жопу
darklagger вне форума Ответить с цитированием
Старый 18.03.2013, 18:48   #6
darklagger
 
Регистрация: 31.07.2010
Сообщений: 7
По умолчанию

крутой блог, кстати
darklagger вне форума Ответить с цитированием
Старый 18.03.2013, 21:05   #7
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

по сабжу. зачем класс? класс = объект. и в принципе объект матрица, ничего против не имею... но я бы рассматривал её лишь как тип данных.
// добавил:
А так, класс имеет массив чисел двойной точности и переменную, которая говорит, скоко колонок в матрице.
бесит то, что матрица всегда квадратичная. а если я хочу 3x2.? если и делать что либо универсальное, то учитывать надо и эту мелочь. Почему меня бесит её реализация как класс... да всё потому, что она только хранит инфу.... и ничего более.... нужна лишь структура данных, где описаны методы cross invoke итд. ну и конечно матрицу иногда требуется normalize. и вобще создаётся она в единичном виде.
// ещё добавил.
Будет проще если вы с начало реализуете объект vector т.е. вектор в математическом смысле.
тогда многие методы в матрице будут короткими и вряд ли запутаетесь. меньше ошибок.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 18.03.2013 в 21:14.
Perchik71 вне форума Ответить с цитированием
Старый 18.03.2013, 21:25   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2Perchik71

а что такое объект? это данные плюс операции над этими данными.
так что класс для матрицы - это то, что нужно. и когда людей чего-то не устраивает они не бесятся, а делают что-то типа такого:
Код:
// column major matrix class =====================================================================
class MatrixF {

	protected:
		float * _elements;
		
		unsigned int _coCount, _roCount, _divC, _divR, _rank;
		float _det;
		
		virtual void FromBuffer(const float *);
	private:
		void Negate();
		void Scale(const float &);

		void DiagonalMultiply(float * vec, unsigned int vcount);


		int InverseMultiply(void * outp, void * dst, unsigned int cocount, unsigned int rdiv) const; // 0 - singular matrix, full pivoting Gauss-Jordan
		void TransposeMultiply(void * outp, void * dst, unsigned int vcount, unsigned int vdiv) const;
		void Multiply(void * outp, void * dst, unsigned int vcount, unsigned int vdiv) const;
		
		
		void TransposeMultiply44(void * dst, unsigned int vcount, void * outp = 0) const;
		void TransposeMultiply22(void * dst, unsigned int vcount, void * outp = 0) const;

		void Multiply44(void * dst, unsigned int vcount, void * outp = 0) const;
		void Multiply22(void * dst, unsigned int vcount, void * outp = 0) const;


		int InverseMultiply44(void * dst, unsigned int cocount) const; // 0 - singular matrix, cofactor calculator
		int InverseMultiply22(void * dst, unsigned int cocount) const; // 0 - singular matrix, cofactor calculator
		int InverseMultiply33(void * dst, unsigned int cocount) const; // 0 - singular matrix, cofactor calculator

	public:
		unsigned int GetColumnCount() const;
		unsigned int GetRowCount() const;
		
		unsigned int GetRank() const; // only if calculated previously by inverse operation, value is ivalided by any arythmec operation (most likely)
		float Determinant() const; // same as rank

		const float * const GetElements() const;

		MatrixF(unsigned int rowC, unsigned int colC, const float * = 0);
		MatrixF(const MatrixF &);

		virtual ~MatrixF();


	// initializers
		MatrixF & Zero();
		MatrixF & Identity(float = 1.0f);
		MatrixF & Translate(const VectorF &);
		MatrixF & Reflect(const VectorF &); // Householder reflection matrix
		MatrixF & Rotate(float angle, const VectorF & = VectorF(0.0f, 0.0f, 1.0f)); // counter clock wise rotation


	// operations
		VectorF operator[](unsigned int); // should work in release only

		MatrixF & operator =(const MatrixF &);

		MatrixF & operator -=(const MatrixF &);
		MatrixF & operator +=(const MatrixF &);
		MatrixF & operator *=(const MatrixF &);
		
		MatrixF & operator *=(const float &);
		MatrixF operator *(const float &) const;

		MatrixF & operator -();
	// inverse
		MatrixF & operator !();

		MatrixF operator -(const MatrixF &) const;
		MatrixF operator +(const MatrixF &) const;
		MatrixF operator *(const MatrixF &) const;

		VectorF operator *(const VectorF &) const;

	// diagonal multiply
		MatrixF	operator /(const VectorF &) const;
		MatrixF	& operator /=(const VectorF &);


	// apply
		VectorF & operator >>(VectorF &) const;
		MatrixF & operator >>(MatrixF &) const;
	// transpose apply
		VectorF & operator ()(VectorF &) const;
		MatrixF & operator ()(MatrixF &) const;
	// inverse apply
		VectorF & operator [](VectorF &) const;
		MatrixF & operator [](MatrixF &) const;

	// transpose-multiply
		VectorF operator ^(const VectorF &) const;
		MatrixF & operator ^=(const MatrixF &);
		MatrixF operator ^(const MatrixF &) const;
	
	// inverse-multiply
		VectorF operator %(const VectorF &);
		MatrixF & operator %=(const MatrixF &);
		MatrixF operator %(const MatrixF &);

		
};
f.hump вне форума Ответить с цитированием
Старый 19.03.2013, 03:34   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Код:
Matrix operator*(double num) const; // это скопипастил чтобы ты таки нашел куда "встроить нахождение определителя"
  Matrix* det() {
     Matrix *det_ = new Matrix(...);
      // рассчитываешь определитель в det_ (загугли как это делается)
      return det_;
  }
};// это скопипастил чтобы ты таки нашел куда "встроить нахождение определителя"
#endif
Перчик71,
Цитата:
по сабжу. зачем класс? класс = объект. и в принципе объект матрица, ничего против не имею... но я бы рассматривал её лишь как тип данных.
ты чето нето куришь, я давно заметил.

Цитата:
и переменную, которая говорит, скоко колонок в матрице.
бесит то, что матрица всегда квадратичная. а если я хочу 3x2.? если и делать что либо универсальное, то учитывать надо и эту мелочь.
Цитата:
Код:
    double** a;
    int row, col; // мелочь учтена, тут два поля, а не одно
Цитата:
нужна лишь структура данных, где описаны методы cross invoke итд. ну и конечно матрицу иногда требуется normalize. и вобще создаётся она в единичном виде.
приведи пример

Последний раз редактировалось rrrFer; 19.03.2013 в 03:39.
rrrFer вне форума Ответить с цитированием
Старый 19.03.2013, 11:19   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
бесит то, что матрица всегда квадратичная. а если я хочу 3x2.? если и делать что либо универсальное, то учитывать надо и эту мелочь.
Нужно делать класс Matrix и подкласс SquareMatrix (см. boost::ublas::matrix). Посмотрю я, как Вы будете для матрицы 3х2 считать определитель.
Цитата:
Почему меня бесит её реализация как класс... да всё потому, что она только хранит инфу.... и ничего более...
Неправда, даже в алгебраической основе. Матрица - это не просто MxN элементов некоторого кольца, это и правила их преобразования.

rrrFer, а с каких пор определитель - это указатель на матрицу?..
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++: класс матрица. Действия с ними MR_Andrew Общие вопросы C/C++ 6 21.07.2015 22:02
Создать Класс матрица Olga@->-->-- Помощь студентам 0 26.11.2012 23:29
Перегрузка операторов, Класс Матрица 5Hur1K Помощь студентам 0 20.02.2012 23:14
Класс «матрица». Инкапсуляция. кристина19 Помощь студентам 0 18.10.2010 20:13
Класс - вещественная матрица ne4eHbko Общие вопросы .NET 1 29.06.2010 23:34