rendered paste body#include <pthread.h>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <windows.h>
#include "det.h"
using namespace std;
struct daneWatku{
double **minors;
int result;
int amount;
};
double det(double ** matrix, int n);
void *detMinor(void* struktura)
{
//double **matrix=(double**)struktura.minors
daneWatku *dane;
dane = (daneWatku*)struktura;
//cout << "Ilosc elementow w macierzy: " << dane->amount << endl;
//cout << "Wyznacznik macierzy: " << det(dane->minors,dane->amount) << endl;
//cout << dane->minors[0][0];
/*for(int i=0;i<dane->amount;i++)
{
for(int j=0;j<dane->amount;j++)
{
cout << dane->minors[i][j] << " ";
}
cout << endl;
}cout << endl;*/
dane->result=det(dane->minors,dane->amount);
return 0;
}
double **matrix_alloc(int n);
void matrix_free(double **macierz, int n);
int main()
{
//pthread_t watek;
//int wartosc = pthread_create(&watek,NULL, fun,(void*)tablica);
//pthread_join(watek,NULL);
//printf("Wartosc z watku: %d\nStan zmiennej globalnej: %d\n",wartosc,tescik);
//for(int i=0;i<3;++i) { for(int j=0;j<3;++j) printf("%d",tablica[i][j]=i+j); printf("\n");}
/* Otwarcie pliku, pobranie wielkości macierzy, przydzielenie pamięci */
ifstream matrixFile;
matrixFile.open("macierz.txt",ifstream::in);
if(!matrixFile.is_open()) return -1;
int matrixSize;
matrixFile >> matrixSize;
cout << matrixSize;
double **mainMatrix = matrix_alloc(matrixSize);
pthread_t watek[matrixSize]; ///Utworzenie uchwytów do wątków
/* Pobranie danych do macierzy */
for(int i=0; i<matrixSize; ++i)
{
for(int j=0; j<matrixSize; ++j)
matrixFile >> skipws >> mainMatrix[i][j];
}
cout << endl;
/* Wyświetlenie pobranej macierzy z pliku */
for(int i=0; i<matrixSize; ++i)
{
for(int j=0; j<matrixSize; ++j)
cout << mainMatrix[i][j] << " ";
cout << endl;
}
double **minory[matrixSize];
for(int i=0;i<matrixSize;++i) minory[i]=matrix_alloc(matrixSize-1);
///Wyznaczanie minorow
int kolumnaMinora=0;
cout << endl;
//Wykreśla pierwszy wierszy i kolejno kolumny
for(int i=0; i<matrixSize; i++)
{
for(int wiersz=1; wiersz<matrixSize; wiersz++)
{
kolumnaMinora=0;
for(int kolumna=0; kolumna<matrixSize; kolumna++)
{
if(i!=kolumna)
{
minory[i][wiersz-1][kolumnaMinora++]=mainMatrix[wiersz][kolumna];
}
}
}
}
//Policz wyznacznik macierzy
double sum = 0;
double sign = 1;
daneWatku doWatku[matrixSize];
for(int a=0;a<matrixSize;++a){
doWatku[a].minors=minory[a];
doWatku[a].amount=matrixSize-1;
}
for(int i=0;i<matrixSize;++i){
pthread_create(&watek[i],NULL,detMinor,&doWatku[i]);
}
for(int i=0;i<matrixSize;++i){
pthread_join(watek[i],NULL);
}
for(int a=0;a<matrixSize;a++)
{
sum+=sign*mainMatrix[0][a]*doWatku[a].result;
sign = -sign;
}
//Wyświetlenie minorów
/*
for(int i=0; i<matrixSize; i++)
{
cout << endl << "Minor: " << i+1 << endl;
for(int wiersz=0; wiersz<matrixSize-1; wiersz++)
{
for(int kolumna=0; kolumna<matrixSize-1; kolumna++)
{
cout << minory[i][wiersz][kolumna] << " ";
}
cout << endl;
}
}*/
/* Wyswietlenie wyniku dzialania programu */
cout << "Wyznacznik macierzy jest rowny: " << det(mainMatrix,matrixSize);
cout << endl << "Wyliczony wyznacznik z minorow: " << sum; //Wyliczony wyznacznik
matrix_free(mainMatrix,matrixSize);
for(int i=0;i<matrixSize;++i) matrix_free(minory[i],matrixSize-1);
matrixFile.close();
}
double **matrix_alloc(int n)
{
double **macierz;
macierz=new double*[n];
//Alokacja pamięci
for(int i=0; i<n; ++i)
{
macierz[i]=new double[n];
}
return macierz;
}
void matrix_free(double **macierz, int n)
{
for(int i=0; i<n; ++i) //Zwolnienie pamięci
{
delete [] macierz[i];
}
delete [] macierz;
}
double det(double ** matrix, int n)
{
if(n==1) return matrix[0][0];
if(n==2) return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]; //Zapobieganie wycieku pamięci - zmiana kolejności instrukcji
double** minor;
double sum=0.0;
double sign=1.0;
int i, kolumnaMinora;
minor=matrix_alloc(n-1);
for(i=0; i<n; i++)
{
for(int wiersz=1; wiersz<n; wiersz++)
{
kolumnaMinora=0;
for(int kolumna=0; kolumna<n; kolumna++)
{
if(i!=kolumna)
{
minor[wiersz-1][kolumnaMinora++]=matrix[wiersz][kolumna];
}
}
}
sum+=sign*matrix[0][i]*det(minor,n-1);
sign = -sign;
};
matrix_free(minor,n-1);
return sum;
}