Другие языки программирования и технологии
С++ и определитель н ого порядка
Выручайте, пишу на с++ программу для определителя n-ого порядка. Не получается. Формулу не получается правильно записать
template <class T > class matrix
{
T** p; // указатель на двумерный массив (на массив указателей на векторы строки)
int Col; // количество строк
int Row; // количество столбцов
public:
...
int rang() {if(Col==Row) return Row;else return 0;} //ранг матрицы (для прямоугольной возвращается 0)
...
};
template<class T > T matrix< T >::det()
{
if(Col!=Row) cerr << "Ошибка нахождения определителя! Матрмца не квадратная. Row=" << Row << ", Col=" << Col << "\a\n",exit(1);
T r(0,0);
int i;
if(rang()==1) r=p[0][0];
else
if(rang()==2) r=p[0][0]*p[1][1]-p[1][0]*p[0][1];
else
for(i=0;i < rang();i++)
{
T t=minorsq(i,0);
r+=(1-(i % 2)*2)*t*p[ i ][0];
}
return r;
}
template<class T > T matrix< T >::minorsq(int x,int y)
{ int i,i1,j,j1;
if(x<0||x>=Row) cerr << "Ошибка входных параметров! Элемента (" << x << "," << y
<< " Нет в матрице (" << Row << "x "<< Col << ")\a\n",exit(1);
if(y<0||y>=Col) cerr << "Ошибка входных параметров! Элемента (" << x << "," << y
<< " Нет в матрице (" << Row << "x "<< Col << ")\a\n",exit(1);
if(rang() < 2) cerr << "Ошибка нахождения минора! Эта функция только для квадратных\
матриц рангом больше 3. Ранг данной матрицы rang=" << rang()
<< ", Row=" << Row << ", Col=" << Col << "\a\n",exit(1);
matrix< T > D(rang()-1,rang()-1);
for(i=i1=0;i < rang();i++)
if(i!=x)
for(i1++,j=j1=0;j < rang();j++)
if(j!=y) D(i1-1,j1)=p[ i ][j],j1++;
return D.det();
}
{
T** p; // указатель на двумерный массив (на массив указателей на векторы строки)
int Col; // количество строк
int Row; // количество столбцов
public:
...
int rang() {if(Col==Row) return Row;else return 0;} //ранг матрицы (для прямоугольной возвращается 0)
...
};
template<class T > T matrix< T >::det()
{
if(Col!=Row) cerr << "Ошибка нахождения определителя! Матрмца не квадратная. Row=" << Row << ", Col=" << Col << "\a\n",exit(1);
T r(0,0);
int i;
if(rang()==1) r=p[0][0];
else
if(rang()==2) r=p[0][0]*p[1][1]-p[1][0]*p[0][1];
else
for(i=0;i < rang();i++)
{
T t=minorsq(i,0);
r+=(1-(i % 2)*2)*t*p[ i ][0];
}
return r;
}
template<class T > T matrix< T >::minorsq(int x,int y)
{ int i,i1,j,j1;
if(x<0||x>=Row) cerr << "Ошибка входных параметров! Элемента (" << x << "," << y
<< " Нет в матрице (" << Row << "x "<< Col << ")\a\n",exit(1);
if(y<0||y>=Col) cerr << "Ошибка входных параметров! Элемента (" << x << "," << y
<< " Нет в матрице (" << Row << "x "<< Col << ")\a\n",exit(1);
if(rang() < 2) cerr << "Ошибка нахождения минора! Эта функция только для квадратных\
матриц рангом больше 3. Ранг данной матрицы rang=" << rang()
<< ", Row=" << Row << ", Col=" << Col << "\a\n",exit(1);
matrix< T > D(rang()-1,rang()-1);
for(i=i1=0;i < rang();i++)
if(i!=x)
for(i1++,j=j1=0;j < rang();j++)
if(j!=y) D(i1-1,j1)=p[ i ][j],j1++;
return D.det();
}
Ничего сложного. читайте про метод гауса приведения к ступенчитому виду, потом надо просто перемножить главную диагональ
Определитель матрицы? n- ого порядка только рекурсией, и там еще надо подумать, как ее реализовать, или готовый код в сети нарыть.
Похожие вопросы
- Excel: как отсортировать столбец с числами по порядку?
- Есть ли простой способ найти несколько последних цифр n-ого числа Фиббоначи?
- Мне со приснился раза 4 подряд то что 23 декабря а не 21-ого конец света наступил это хорошо ли?
- дан массив целых чисел F1,F2...Fn. распечатать элементы, нах-ся между min и max и их номера. подскажите где я ошибся
- Куда поступить на программиста после 11-ого класса?
- Дан двумерный массив целых чисел. Упорядочить прямую диагональ в порядке убывания.
- Скажите, пожалуйста, в каком порядке нужно все это изучать? (см. дальше)
- С клавиатуры вводятся числа, пока не будет введен ноль, вывести числа в обратно порядке. С++ Голову сломал !!!
- вывести PID процессов в порядке убывания С++ Как можно вывести PID процессов в порядке убывания на с++?
- ХЕЛП Дана квадратная матрица порядка n. на языке C или C ++