Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Классы для операции


Автор: recruit 29.11.2005, 22:19
Надо написать

Классы для операций (арифметических, обращения, транспонирования) с двумерными матрицами.

Вот это мне дали, но мне нужно размерность квадратной матрицы равной n*n.

Тут нужно переписать ф-цию нахождения определителя и операцию нахождения обратной матрицы.

Так же не проверяется равенство определителя 0.

Помогите плиз, а то я в си не особо (




Файл заголовка "Matrix.h":


Код

const int iDimension=2;
class CMatrix
{
private:
        float Data[iDimension][iDimension];
public:
        CMatrix();
        ~CMatrix(){}
        float Determinant();
        friend CMatrix operator+(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&);
        friend CMatrix operator*(CMatrix&,CMatrix&);
        friend CMatrix operator*(float,CMatrix&);
        friend CMatrix operator*(CMatrix&,float);
        friend CMatrix operator/(CMatrix&,float);
        friend CMatrix operator!(CMatrix&);
        friend CMatrix operator~(CMatrix&);
        void InputMatrix();
        void PrintMatrix();
};


Фйл "Matrix.cpp":

Код

#include<iostream.h>
#include"Matrix.h"
CMatrix::CMatrix()
{
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Data[i][j]=0;
}
void CMatrix::InputMatrix()
{
        cout<<"Please enter matrix("<<iDimension<<"x"<<iDimension<<"):\n";
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        cin>>Data[i][j];
}
void CMatrix::PrintMatrix()
{
        for(int i=0;i<iDimension;i++)
        {
                for(int j=0;j<iDimension-1;j++)
                        cout<<Data[i][j]<<" ";
                cout<<Data[i][iDimension-1]<<"\n";
        }
}
CMatrix operator +(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[i][j]+b.Data[i][j];
        return Result;
}
CMatrix operator -(CMatrix& a,CMatrix& b)
{
        return a+((-1)*b);
}
CMatrix operator -(CMatrix& a)
{
        return a*(-1);
}
CMatrix operator *(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++) 
                for(int j=0;j<iDimension;j++)
                        for(int k=0;k<iDimension;k++)
                                Result.Data[i][j]=Result.Data[i][j]+a.Data[i][k]*b.Data[k][j]; 
        return Result;
}
CMatrix operator *(float a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a*b.Data[i][j];
        return Result;        
}
CMatrix operator *(CMatrix& a,float b)
{
        return b*a;        
}
CMatrix operator /(CMatrix& a,float b)
{
        return (1/b)*a;
}
float CMatrix::Determinant()
{ 
        return Data[0][0]*Data[1][1]-Data[0][1]*Data[1][0];
}
CMatrix operator !(CMatrix& a)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[j][i];
        return Result;        
}
CMatrix operator ~(CMatrix& a)
{        
        CMatrix Result;
        float m=1/a.Determinant();
        Result.Data[0][0]=a.Data[1][1];
        Result.Data[0][1]=-a.Data[1][0];
        Result.Data[1][0]=-a.Data[0][1];
        Result.Data[1][1]=a.Data[0][0];
        Result=(!Result)*m;
        return Result;
}



Автор: sergejzr 29.11.2005, 22:26
Пользуйтесь поиском! Вопросы по матрице раз в три дня тут.

Автор: recruit 30.11.2005, 01:22
поискал, ничего не нашел

Автор: Alexandr87 30.11.2005, 06:03
Сишного компилятора нет, могу помочь только советом.
Внеси размерность массива в класс, и соотвественно при вводе, спрашивай размерность, выделяй память и записывай.
Сделай дополнительный конструктор с параметрами -размерность, массив данных.
Затем создай три метода
double getM(int row,int col) - минор
double getA(int row,int col) - алгебр. дополнение
double getD()-собственно сам детерминант

getM() - возвращает результат getD() для матрицы минора (матрица без столбца и строки int row,int col [вот здесь тебе и понадобиться конструктор описанный выше])
getA() - возвращает алгебраическое дополнение используя getM()
getD()- возвращает - единственный элемент массива данных, если размерность равна 1, в другом случае получает определитель разложение по первому столбцу, т.е.
Код

double temp=0.0;
if (iDimension==1) {
  return Data[0][0];
}
for (int x:=0; x<iDimension; x++) {
  temp+=Data[x][0]*getA(x,0);
}
return temp;

Вот такая рекурсия.

Автор: recruit 30.11.2005, 18:06
попробую спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)