Errore di segmentazione

Forum di discussioni su C e C++

Moderatori: Toki, skynet

Regole del forum
Leggi: IProgrammatori.it - Regolamento Forum
davide123
New Entry
Messaggi: 6
Iscritto il: 04 set 2017, 14:59

Errore di segmentazione

Messaggioda davide123 » 13 set 2017, 10:22

Devo scrivere un programma che mi diagonalizzi una matrice simmetrica. chiedendo al programma di diagonalizzare questa matrice
11 5 6
5 8 7
6 7 9
mi viene segnalato errore di segmentazione.
questo è l'output della shell

Codice: Seleziona tutto

11.8099 8.78691 8.99227
-2.55477 3.43369 2.03447
6 7 9

14.7202 8.88178e-16 8.99227
4.44089e-16 4.27985 2.03447
8.99227 2.03447 9

questa è m:
9 1.63042e-322 0
4.44089e-16 4.27985 2.03447
8.99227 2.03447 9

0.802293 -0.596931 0
0.596931 0.802293 0
0 0 1

Errore di segmentazione (core dump creato)

il problema secondo me sta nel fatto che la posizione (1,1) della matrice m però non capisco da dove venga il 10^-322 considerando il fatto che la matrice m e la matrice scritta subito prima di m dovrebbero essere identiche.

Codice: Seleziona tutto

#include <iostream>
#include <cmath>
#include<iomanip>//setw(int):regola cifre decimali  fixed, setprecision()
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <sstream>
using namespace std;

class matrice
 {
  int a;//indica dimensione della matrice
  double **b;
  public:
  void diagonalizza(matrice m, matrice b, matrice vett)
   {
    for(int i=0;i<m.a;i++)
     {
      for(int j=0;j<m.a;j++)
       {
        matrice u(m, 1);
        matrice ut(m, 1);
        if(i!=j)
         {
          if(fabs(m[i][j])>1e-10)
           {
            double b=(m[i][i]-m[j][j])/(2*m[i][j]);
            double x1=b+sqrt(1+b*b);
            double x2=b-sqrt(1+b*b);
            double coseno;
            double seno;
            if(fabs(x1) <= fabs(x2))
             {
              coseno=1/sqrt(1+x1*x1);
              seno=x1/sqrt(1+x1*x1);
              }
            else
             {
              coseno=1/sqrt(1+x2*x2);
              seno=x2/sqrt(1+x2*x2);
              };
                   
            if(acos(coseno)> 1e-8)
             {
              ut[i][i]=coseno;
              ut[j][j]=coseno;
              ut[i][j]=-seno;
              ut[j][i]=seno;
              u[i][i]=coseno;
              u[j][j]=coseno;
              u[i][j]=seno;
              u[j][i]=-seno;
              //cout/*<<u<<"\n"*/<<m<<"\n";
              m=((ut*m)*u);cout<<"questa è m:\n"<<m<<"\n"<<flush;
              vett *= u;             
              }
            }
          }
        }
      }
   
    if(m==b)
     {
      for(int i=0;i<m.a;i++)
       {
        for(int j=0;j<m.a;j++)
         {
          if(fabs(m[i][j])<9.9999e-6)m[i][j]=0;
          }
        }
   
     for(int i=0;i<m.a;i++)
      {
       for(int j=0;j<m.a;j++)
        {
         if(fabs(vett[i][j])<9.9999e-6)vett[i][j]=0;
         }
       }
     cout<<"questa è la matrice diagonalizzata:"<<endl<<m<<"e questa è la matrice degli autovettori:"<<endl<<vett;
      }
    else
     {
      diagonalizza(m,m,vett);
      }
    }

  matrice(char** args)
   {
    ifstream is (args[1]);
    if (!is) cerr << "qualcosa non va\n", exit (2);//verifico presenza del file
    is.seekg(0, ios::end);//posiziono stream alla fine
    streamsize sz= is.tellg();//guardo la distanza tra la fine e l'inizio dello stream
    char *buff= new char [1+sz];
    is.seekg(0);
    is.read(buff, sz);
    is.close();
    buff [sz]=0;
    istringstream iss;
    iss.str(buff);
    double **dati;
    char *linea=new char [50001];
    iss.getline(linea,50000,'\n');
    int conta=0,contarighe=1;
    char *ret;
    ret=strtok(linea," \t");
    if (!ret) cerr<<"forse il documento è vuoto?\n",exit(3);
    do ret=strtok(nullptr," \t"), ++conta; while(ret);
    delete [] linea;
    while (true)
     {
      iss.ignore(1000000,'\n');
      if(iss.eof()) break;
       {
        ++contarighe;
        }
      }
    dati = new double *[contarighe];
    for (int i=0; i != contarighe; ++i)
     {
      dati[i]= new double [conta];
      }
    iss.clear(), iss.seekg(0);
    for(int i=0; i != contarighe; ++i)
     {
      for(int j=0; j != conta; ++j)
       {
        iss >> dati [i][j];//assegna valori alla matrice
        }
      }
    b=dati;
    a=conta;
    }

  matrice(const matrice& c)
   {
    a=c.a;
    double** risultato=new double* [a];
    for(int i=0;i<a;i++)
     {
      risultato[i]=new double[a];
      for(int j=0;j<a;j++)
       {
        risultato[i][j]=c.b[i][j];
        }
      }
    b=risultato;
    };

  bool operator==(matrice g)
   {
    bool d=true;
    for(int i=0;i<a;i++)
     {
      for(int j=0;j<a;j++)
       {
        double h=b[i][j]-g.b[i][j];
        if(fabs(h)>1e-8)d=false;
        }
      }
    return d;
    }

  matrice()
   {
    cout<< "quale è la dimensione della matrice? ";
    cin >> a;
    double** d=new double* [a];
    for(int i=0;i<a;i++)
     {
      d[i]=new double[a];
      for(int j=0;j<a;j++)
       {
        cout <<"inserisci il valore in (" <<i+1 <<',' << j+1 << ") ";
        cin>>d[i][j];
        }
      }
    b=d;
    }

  matrice(matrice g, int h)
   {
    a=g.a;
    double** risultato=new double* [a];
    for(int i=0;i<a;i++)
     {
      risultato[i]=new double[a];
      for(int j=0;j<a;j++)
       {
        if(i!=j)
         {
          risultato[i][j]=0;
          }
        else
         {
          risultato[i][j]=h;
          }
        }
      }
    b=risultato;
    }

  ~matrice(){delete[] b;}

  double* operator[](int e){return b[e];}

  matrice operator*(matrice d)
   {
    matrice res(d,0);
    //res.a=a;
    for(int i=0;i<a;i++)
    {
     for(int j=0;j<a;j++)
      {
       for(int k=0;k<a;k++)
        {
         res[i][k]+=(b[i][j]*d.b[j][k]);
         }
       }
     }
    cout<<res<<"\n";
    return res;
    }

  friend void operator *=(matrice&, matrice);

  friend ostream &operator<<(ostream&, matrice);

  };

void operator *=(matrice &a, matrice b)
 {
  a=a*b;
  }

ostream &operator<<(ostream& stream, matrice a)
 {
  for(int i=0;i<a.a;i++)
   {
    for(int j=0;j<a.a;j++)
     {
      stream<<a[i][j]<<' ';
      }
     stream<<endl;
    }
  return stream;
  };

int main(int narg, char** args)
{
 if(narg==1)
  {
   matrice m;
   matrice vett(m,1);
   m.diagonalizza(m,m,vett);
   }
 else
  {
   matrice m(args);//matrice m di qualcosa
   matrice vett(m,1);
   m.diagonalizza(m,m,vett);
   }
 }

Torna a “C/C++”

Chi c’è in linea

Visitano il forum: abcertaidea, Baidu [Spider], Bing [Bot], Google [Bot], oregon e 74 ospiti