Determinant

Post date: Nov 28, 2013 1:10:29 AM

در این پست دترمینان یک ماتریس n در n دلخواه را حساب می‌کنیم. در پست قبلی در مورد جایگشت‌های n عدد گفتم. با استفاده از آن و یک فرمول در ریاضیات می‌شود دترمینان یک ماتریس n در n را حساب کرد. فرمول این است:

مجموع روی همه جایگشت‌های n عدد گرفته می‌شود و منظور از نمادی که به شکل لیوان وارونه است، حاصل ضرب است. با این فرمول، این برنامه‌ایی است که دترمینان یک ماتریس n در n دلخواه را حساب می‌کند:

#include <conio.h>

#include <iostream>

#include <vector>

using namespace std;

class Permute

{

vector<int> set;

vector<vector<int> > all;

public:

void Print()

{

unsigned size = all.size();

for(unsigned i = 0; i < size; i++)

{

unsigned size_i = all[i].size();

for(unsigned j = 0; j < size_i; j++)

cout<< all[i][j] << " ";

cout<< "\n";

}

}

//-------------------------------------------

void Run()

{

unsigned size = set.size();

if(size == 0)

return;

if(size == 1)

{

all.push_back(set);

return;

}

unsigned i = 0; /* sweeper item can be any number between 0 & size - 1 */

vector<int> subset;

for(unsigned j = 0; j < size; j++)

{

if(i != j)

subset.push_back(set[j]);

}

Permute P(subset);

unsigned allsize = P.Size();

for(unsigned k = 0; k < allsize; k++)

{

unsigned size_k = P[k].size();

for(unsigned m = 0; m <= size_k; m++)

{

P[k].insert(P[k].begin() + m,set[i]);

all.push_back(P[k]);

P[k].erase(P[k].begin() + m);

}

}

}

//-------------------------------------------

unsigned Size()

{

return all.size();

}

//-------------------------------------------

vector<int>& operator [](unsigned i)

{

if(Size() <= i)

i = Size() - 1;

return all[i];

}

public:

Permute(vector<int> set)

: set(set)

{

Run();

}

};

int Sign(vector<int> v) // sign of the permutation

{

unsigned returns = 0;

unsigned size = v.size();

for(unsigned i = 0; i < size; i++)

for(unsigned j = i + 1; j < size; j++)

{

if(v[j] < v[i])

returns++;

}

if(returns % 2 == 0)

return 1;

else

return -1;

}

template<const int n> // n by n matrix

double Determinant(double a[n][n]) // determinant

{

vector<int> v;

for(unsigned i = 0; i < n; i++)

v.push_back(i);

Permute P(v);

unsigned size = P.Size();

double sum = 0;

for(unsigned k = 0; k < size; k++)

{

double prod = Sign(P[k]);

for(unsigned i = 0; i < n; i++)

prod *= a[i][P[k][i]];

sum += prod;

}

return sum;

}

int main()

{

double a[3][3] =

{

{0, 0, 1},

{5,-2, 6},

{1, 1, 2}

};

cout<< Determinant<3>(a);

_getch();

}

Output:

7

در این برنامه دترمینان یه ماتریس 3 در 3 حساب شده است. در واقع بخشی از این برنامه همان چیزی است که در پست‌های قبلی آورده شده است. و چیزی که اضافه شده همان فرمول دترمینان است.