All pastes #2093884 Raw Edit

Miscellany

public text v1 · immutable
#2093884 ·published 2011-11-11 21:59 UTC
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;
}