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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2011, 23:14   #1
igsxor
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 35
Вопрос Модификация алго поиска Детерминанта

Доброго времени.
Подскажите можно ли модифицировать код т.к. необходим алгоритм с выбором главного элемента во всей матрице.

В данном коде указывается размерность матрицы и рандомно заносятся значения не более числа 100,и идёт поиск определителя,но есть проблема,в том что для матриц 200 x 200(и более) вывод получается равным бесконечности(-бесконечности).

Может конечно зря использую вектора...Времени уже практически нет переделывать.
P.S.за помощь отблагодарю на wmz
Код:
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <vector>
using namespace std;
void showMenu();
void showInputMatrix(std::vector< std::vector<double> > sq_matrix);
                    
double determinant(std::vector< std::vector<double> >& matrix);
int main(int argc, char *argv[])
{
    
    int choice;
    double dtm;
         
    showMenu();
    cin>>choice;
   
   while(choice != 0){
   switch(choice)
   {
     case 1:{
          vector<vector<double> > square_matrix; 
          vector<double> line;
          int n; 
          srand ( time(NULL) );
          cout<<"Vvedite razmernost' matrix:\n";
          cin>>n;
          double temp;
          cout<<"Vvedite znachenie:\n";
          for(int i=0;i<n;i++)
          {
            line.clear();
             for(int j=0;j<n;j++)
             {
               //cin>>temp;
               //temp = rand()%10;
               line.push_back( (rand()%100+1) );                  
                //cout<<"Vvedite znachenie:\n";
             }
      
            square_matrix.push_back(line);
          }
    
          showInputMatrix(square_matrix);
          dtm = determinant(square_matrix);
          cout<<"Determinant matrix "<<n<<"x"<<n<<" = ";
          dec(cout);
          cout<<dtm<<endl;
     break;}//end case 1
     case 0:
        cout<<"exit...\n";
     break;   
   }//end switch
  
   showMenu();
   cin>>choice;
}//end while 


    system("PAUSE");
    return EXIT_SUCCESS;
}

//################opredelenie##################
void showInputMatrix(std::vector< std::vector<double> > matrix)
{    int i,j;
     cout<<"Matrix"<<endl;
       for(i=0;i<matrix.size();i++)
       {
         for(j=0;j<matrix.size();j++)
         { 
           dec(cout);
           cout.width(11);
           cout.precision(10);
           cout<<matrix[i][j]<<"|";
         }
        cout<<endl;
       }
}

void showMenu()
 {
    cout<<"vvedite 1 ili 0:\n"
    "1 - Vichislyaem opredelitel matrizcy\n"
    "0 - Vihod\n";
 }
 
double determinant(std::vector< std::vector<double> >& matrix)  //nahodim opredelitel 
{   //function find determinant
    //
    int i=0, j=0;
    double koef = 1;
    double lastKoef = 0;
    bool checkKoefIsNull = false;
    int length = matrix.size();
    int fullCol = length;
    clock_t time_on;
    time_on = clock();
     for(i=0; i<length && koef; i++)
    {
        if(matrix[i][j] != 0)
        {
            if(matrix[i][j] < 0)
            {
                for(int j=0; j<fullCol; j++)
                    matrix[i][j] *= -1;
                koef *= -1;
            }
            double lastKoef = matrix[i][j];
            for(int k=0; k<fullCol; k++)
                matrix[i][k] /= lastKoef;
            koef *= lastKoef;
            for(int nextRow=i+1; nextRow<length; nextRow++)
            {
                lastKoef = matrix[nextRow][j];
                for(int nextCol=j; nextCol<fullCol; nextCol++)
                    matrix[nextRow][nextCol] -= lastKoef*matrix[i][nextCol];
            }
            ++j;
            checkKoefIsNull=false;
        }
        else
        {
            for(int k=0; k<fullCol; k++)
                std::swap(matrix[i][k],matrix[length-1][k]);
            --i;
            koef *= -1;
            if(checkKoefIsNull)
            {
                ++i;
                koef = 0;
            }
            checkKoefIsNull = true;
        }
     }//end for
     
     cout<<endl;
     cout<<"time: "<<((double)clock() - time_on)/CLOCKS_PER_SEC<<endl;
        return koef;
}

Компилятор: Dev-C++

Последний раз редактировалось igsxor; 02.04.2011 в 23:23.
igsxor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модификация рандома RayGGG Общие вопросы C/C++ 2 17.02.2011 03:43
Pascal(Алго)Задача на расписание Дьявол Тоже Плачет Помощь студентам 4 15.01.2011 19:10
Вычисление детерминанта третьего порядка на Delphi sustema3 Помощь студентам 1 19.12.2010 16:43
Модификация фаила *.db @#dro# Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 30.01.2010 18:15
Кто может написать програму для вычисления детерминанта в паскале? Mita Помощь студентам 3 11.07.2007 21:11