Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2011, 13:11   #1
BloodMaX
Пользователь
 
Регистрация: 27.09.2009
Сообщений: 29
По умолчанию определитель квадратной матрицы

есть матрица C[N][N] , больше 100
нужно найти определитель, нашел 2 кода по теме, один не считает больше 50, другой с указателем, помогите пожалуйста....


с указателем (я просто не знаю как свои int таблицу в ** long double запихать)
Код:
void minvert(int N,long double** matrix){
  long double** e= new long double*[N];
  // initializing matrix e
  for(int i=0;i<N;i++)
    e[i]= new long double[N];
  for (int i=0;i<N;i++)
    for (int j=0;j<N;j++)
      e[i][j]=(i==j?1:0);
  // converting matrix to e
  for(int i=0;i<N;i++)
  {
    // normalizing row (making first element =1)
    long double tmp=matrix[i][i];
    for(int j=N-1;j>=0;j--)
    {
      e[i][j]/=tmp;
      matrix[i][j]/=tmp;
    }
    // excluding i-th element from each row except i-th one
    for(int j=0;j<N;j++)
      if (j!=i)
      {
        tmp=matrix[j][i];
        for(int k=N-1;k>=0;k--)
        {
          e[j][k]-=e[i][k]*tmp;
          matrix[j][k]-=matrix[i][k]*tmp;
        }
      }
  }
  // now e contains inverted matrix so we need only to copy e to matrix
  for(int i=0;i<N;i++)
    for(int j=0;j<N;j++)
      matrix[i][j]=e[i][j];
}

код на маленькие матрицы

Код:
void get_matr(int matrix[N][N],int kolvo,int i,int j)	//процедура вычеркивания строки и столбца
{
	int ki,kj,di,dj;
	di=0;
	for (ki=0;ki<kolvo-1;ki++)
	{
		if (ki==i) di=1;
		dj=0;
		for (kj=0;kj<kolvo-1;kj++)
		{
			if (kj==j) dj=1;
			temp_matrix[ki][kj]=matrix[ki+di][kj+dj];
		}
	}
}

float det(int matrix[N][N], int count)	//функция вычисления определителя(матрица,размерность)
{


	float temp=0;	//временная переменная для хранения определителя
	int k=1;	//степень
/*=============================================================================================================
													вычисление определителей
==============================================================================================================*/
	if(count<1){
		std::cout<<"not run";
                return 0;
        }
	else if (count==1)
		temp=matrix[0][0];
	else if (count==2)
		temp=matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1];
	else
	{
		for(i=0;i<count;i++)
		{
			get_matr(matrix,count,i,0);
			
			temp=temp+k*matrix[i][0]*det(temp_matrix,count-1);
			k=-k;
		}
	}
	return temp;
}
BloodMaX вне форума Ответить с цитированием
Старый 17.12.2011, 19:57   #2
BloodMaX
Пользователь
 
Регистрация: 27.09.2009
Сообщений: 29
По умолчанию

народ в чем проблема? почему большие матрицы не берет? или как сконвертировать int C[n][n] в long double двойной указатель?
BloodMaX вне форума Ответить с цитированием
Старый 02.03.2012, 15:57   #3
vanomux
 
Регистрация: 13.02.2012
Сообщений: 5
По умолчанию

вот код http://algorithmlib.org/gauss_det вроде с матрицой 10x10 справляется.Может дело в типах данных(переполнение).В с++ есть библиотека для работы с большими числами
vanomux вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определитель матрицы на С GT_NiNo Помощь студентам 0 21.10.2011 18:53
Определитель матрицы Rekky Свободное общение 10 24.05.2011 20:40
Определитель матрицы 2 на 2 С++ Mashul'ka Помощь студентам 1 03.11.2010 00:08
Определитель квадратной матрицы Tomoyo Помощь студентам 22 04.11.2008 22:37