Класс матриц

есть рабочий класс матриц. Все работает отлично, но надо сделать функцию или перегрузить оператор >> для считывания матрицы из файла. Причем надо работать с потоками.(в main использую fstream). Что только не перепробовал, ничего не выходит. Надеюсь на вашу помощь.
class Matrix
{
public:
    int str; // Количество строк
    int slb; // Количество столбцов
    Matrix(int dim1, int dim2);
    Matrix(const Matrix &A);
    ~Matrix(void);
    static ****** Det(Matrix A);
    ******** Array; // Массив для элементов матрицы
    Matrix Transponent(void) const;
    Matrix operator+(Matrix A) const;
    Matrix operator-(Matrix A) const;
    Matrix operator*(Matrix A) const;
    Matrix operator*(****** a) const;
    Matrix operator/(****** a) const;
    static Matrix Inverse(Matrix A);
    static Matrix Solve(Matrix A,Matrix b);
    static ****** AlgAdd(Matrix A,int x,int y);
    bool operator==(Matrix A) const;
    void operator=(Matrix A);
    void InString(void);
 
};
8 ответов

std::istream & operator>>(std::istream & lhv,Matrix & rhv){
   //Код считывания матрицы из файла
   return lhv;
}


Попробовал как вы написали, с тем отличием что объявил метод Friend'ом. Почему-то считывает матрицу заполненную нулями.


Мы не телепаты. Покажите код.


Даже не так. Он не считывает ничего из файла, просто вернул матрицу нужной размерности, которая конструктором инициализируется нулями.
using namespace std;
 
class Matrix
{
public:
    int str; // Количество строк
    int slb; // Количество столбцов
    Matrix(int dim1, int dim2);
    Matrix(const Matrix &A);
    ~Matrix(void);
    static ****** Det(Matrix A);
    ******** Array; // Массив для элементов матрицы
    Matrix Transponent(void) const;
    Matrix operator+(Matrix A) const;
    Matrix operator-(Matrix A) const;
    Matrix operator*(Matrix A) const;
    Matrix operator*(****** a) const;
    static Matrix Inverse(Matrix A);
    static Matrix Solve(Matrix A,Matrix b);
    static ****** AlgAdd(Matrix A,int x,int y);
    void operator=(Matrix A);
    void InString(void);//вывод на экран
    friend istream & operator>>(std::istream & lhv,Matrix & rhv){
   return lhv;
}
    };


Матрицу кто заполнять будет? Уборщица?


Вот весь класс. Кода много, так как много чего требуется по заданию. Класс полностью рабочий. Только метод гаусса не доделан.
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<fstream>
#include<math.h>
using namespace std;
 
class Matrix
{
public:
    int str; // Количество строк
    int slb; // Количество столбцов
    Matrix(int dim1, int dim2);
    Matrix(const Matrix &A);
    ~Matrix(void);
    static ****** Det(Matrix A);
    ******** Array; // Массив для элементов матрицы
    Matrix Transponent(void) const;
    Matrix operator+(Matrix A) const;
    Matrix operator-(Matrix A) const;
    Matrix operator*(Matrix A) const;
    Matrix operator*(****** a) const;
    static Matrix Inverse(Matrix A);
    static Matrix Solve(Matrix A,Matrix b);
    static ****** AlgAdd(Matrix A,int x,int y);
    void operator=(Matrix A);
    void InString(void);//вывод на экран
    friend istream & operator>>(std::istream & lhv,Matrix & rhv){
   return lhv;
}
    };
 
//Конструктор
Matrix::Matrix(int dim1 = 2, int dim2 = 2):str(dim1),slb(dim2)
{
    ******** a = new *******[str];
    for (int i=0; i<str; i++)
        a[i] = new ******[slb];
 
    //Присваивем 0(инициализируем)
    for (int i=0; i<str; i++)
        for (int j=0; j<slb; j++)
            a[i][j] = 0;
    Array = a;
}
//Конструктор копирования
Matrix::Matrix(const Matrix &A)                 
{
str = A.str;
slb = A.slb;
        Array=new *******[str];
        for (int i=0; i<str; i++)
                Array[i]=new ******[str];
        
        for (int i=0; i<str; i++)
                for (int j=0; j<slb; j++)
                {
                        Array[i][j]=A.Array[i][j];
                }
}
//деструктор
Matrix::~Matrix(){
    str=0;
    slb=0;
    delete Array;
}
//Определитель
****** Matrix::Det(Matrix A)
{
    if (A.str != A.slb)
    {
        return 1;
    }
    if (A.str == 1)
        return A.Array[0][0];
    if (A.str == 2)
        return A.Array[0][0]*A.Array[1][1] - A.Array[0][1]*A.Array[1][0];
    ****** det = 0;
 
    // Разложение определителя по первому столбцу
    for (int i=0; i<A.str; i++)
        det += A.Array[0][i]*A.AlgAdd(A,0,i);
 
    return det;
}
//Операция транспонирования
Matrix Matrix::Transponent(void)const
{
    Matrix ResultMatrix(slb, str);
    for (int i=0; i<slb; i++)
        for (int j=0; j<str; j++)
            ResultMatrix.Array[i][j] = Array[j][i];
    return ResultMatrix;
}
//Перегрузки операций
Matrix Matrix::operator+(Matrix A)const
{
    Matrix ResultMatrix (str, slb);
    if ((str != A.str) || (slb != A.slb))
    {
        return ResultMatrix;
    }
    for (int i=0; i<str; i++)
        for (int j=0; j<slb; j++)
            ResultMatrix.Array[i][j] = Array[i][j] + A.Array[i][j];
    return ResultMatrix;
}
 
Matrix Matrix::operator-(Matrix A)const
{
    Matrix ResultMatrix (str, slb);
    if ((str != A.str) || (slb != A.slb))
    {
        return ResultMatrix;
    }
    for (int i=0; i<str; i++)
        for (int j=0; j<slb; j++)
            ResultMatrix.Array[i][j] = Array[i][j] - A.Array[i][j];
    return ResultMatrix;
}
 
Matrix Matrix::operator*(Matrix A)const
{
    Matrix ResultMatrix(str, A.slb);
    if (slb != A.str)
    {
        return ResultMatrix;
    }
    for (int i=0; i<str; i++)
        for (int j=0; j<A.slb; j++)
            for (int l=0; l<slb; l++)
                ResultMatrix.Array[i][j] += Array[i][l]*A.Array[l][j];
    return ResultMatrix;
}
 
Matrix Matrix::operator*(****** a)const
{
    Matrix ResultMatrix(str, slb);
    for (int i=0; i<str; i++)
        for (int j=0; j<slb; j++)
            ResultMatrix.Array[i][j] = a*Array[i][j];
    return ResultMatrix;
}
//алгебраическое дополнение(нужно для обратной матрицы и определителя)
****** Matrix::AlgAdd(Matrix A, int x,int y){
    Matrix b(A.str-1,A.slb-1);
    int i,j,bi,bj;
 
    for(i=0, bi=0;i<A.str;i++)
    {   if(i!=x)
        {   for(j=0, bj=0;j<A.slb;j++)
                if(j!=y)
                {   b.Array[bi][bj]=  A.Array[i][j];
                    bj++;
                }
            bi++;
        }
    }
    ****** k = b.Det(b)*pow(-1.0,x+y);
    return k;
}
//обратная матрица
Matrix Matrix::Inverse(Matrix A){
    if (Matrix::Det(A)==0) {
        cout<<"Det = 0 , Inverse not exist"<<endl;
        return 0;
    }
    Matrix b(A.str,A.slb);
    ****** d;
    int i,j;
    d=Matrix::Det(A) ;
    
    for(i=0;i<A.str;i++)
        for(j=0;j<A.slb;j++)
            b.Array[i][j] = A.AlgAdd(A,i,j)/d;
 return b.Transponent();
 
}
//метод гаусса
Matrix Matrix::Solve(Matrix A,Matrix b){
 ****** v;
 int n= A.str;
 int p = A.slb;
 for(int k = 0,i,j,im; k < n - 1; k++)
        {
                im = k;
                for(i = k + 1; i < n; i++)//ищем максимальный элемент в столбце
                {
                        if(fabs(A.Array[im][k]) < fabs(A.Array[i][k]))
                        {
                                im = i;
                        }
                }
                if (A.Array[im][k]==0) goto m;
                if(im != k)//если максимальный элемент не на диагонали
                {
                        for(j = 0; j < p; j++)//меняем строки местами,чтобы максимальный элемент был на диагонали.
                        {
                                v                = A.Array[im][j];
                                A.Array[im][j] = A.Array[k][j];
                                A.Array[k][j]  = v;
                        }
                        v     = b.Array[im][0];
                        b.Array[im][0] = b.Array[k][0];
                        b.Array[k][0]  = v;
                }
                for(i = k + 1; i < n; i++)//прямой ход
                {
                        v               = A.Array[i][k]/A.Array[k][k];
                        A.Array[i][k] = 0;
                        b.Array[i][0] = b.Array[i][0] - v*b.Array[k][0];
                        if(v != 0)
                        for(j = k + 1; j < p; j++)
                        {
                                A.Array[i][j] = A.Array[i][j] - v*A.Array[k][j];
                        }
                }
                m: ;
        }
 ****** s = 0;
 Matrix X(n,1);
 A.InString();
 b.InString();
Matrix mas(1,A.str);
 for ( int i = 0; i < A.str; i++)
 {
     int k=0;
     for ( int j = 0; j < A.slb; j++)
         if (A.Array[i][j]==0) k++;
     if (A.slb==k) if (b.Array[i][0]!=0) {
         cout<<"sistema nesovmestna"<<endl;
         return b;
         mas.Array[0][i]=0;
     }
     else mas.Array[0][i]=1;
 }
 mas.InString();
 
 //обратный ход
        X.Array[n - 1][0] = 1.0*b.Array[n - 1][0]/A.Array[n - 1][n - 1];
        for(int i = n - 2, j; 0 <= i; i--)
        {
                s = 0;
                for(j = i + 1; j < n; j++)
                {
                        s = s+A.Array[i][j]*X.Array[j][0];
                }
                X.Array[i][0] = 1.0*(b.Array[i][0] - s)/A.Array[i][i];
        }
 
 
 
return X;
}
//Оператор присваивания
void Matrix::operator=(Matrix A)
{
    ******** a = new *******[A.str];
    for (int i=0; i<A.str; i++)
        a[i] = new ******[A.slb];
    
    for (int i=0; i<A.str; i++)
        for (int j=0; j<A.slb; j++)
            a[i][j] = A.Array[i][j];
 
    Array=a;
    str = A.str;
    slb = A.slb;
}
//Вывод на экран
void Matrix::InString(void)
{
    for (int i=0; i<str; i++)
    {
        for (int j=0; j<slb; j++)
            cout<<setw(8)<<Array[i][j];
        cout<<endl;
    }
}
friend istream & operator>>(std::istream & lhv,Matrix & rhv){
        for(int i = 0, j ; i < rhv.str; i++)
            for(j = 0; j<rhv.slb; j++)
                lhv>>rhv.Array[i][j];
   return lhv;
}
Я деревянен немного, извините) Но вроде работаетСпасибо!Теперь новый вопрос) почему теперь не выполняется проверка, что матрицы не соответсвуют размерностям?
fstream fin;
fin.open("Input.txt");
int size1,size2,size3,size4;
        fin>>size1;
        fin>>size2;
        fin>>size3;
        fin>>size4;
        Matrix A(size1, size2);
        Matrix B(size3, size4);
        Matrix b(size1,1);
                fin>>A;
                fin>>B;
                fin>>b;
if (!fin.eof()) {cout<<"Matrici ne sootvetstvuyut razmernostyam"<<endl; goto l;}
fin.close();


Потому что не выполняеться это
!fin.eof()
В файле ест еще данные. Разберитесь как считывать 1 матрицу. Поймете как много.


Просто когда я в тупую считывал матрицы в main'e ( поэлементно 2-мя циклами, по сути также как написал в классе) то все работало. Если размерности были меньше,чем у написанных матриц, то файл читался не до конца,и соответственно была ошибка. Теперь изменился только способ считывания матриц, и даже на корректных данных стало выдавать что размерности не совпадают. Хотя если эту строку с проверкой закоментить, и дать программе работать, то видно что матрицы он считал корректно.хммм... Теперь работает)) странненько)а теперь не работает опять. Ничего не менял причем. чезахрень.Понял в чем дело. Там остался лишний пробел в самом конце. Поэтому типо файл и не прочитан до конца.как теперь дополнить условие, чтобы этот лишний пробел не мешал? Да любой символ чтобы не мешал.