Форум программистов, компьютерный форум CyberForum.ru

Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 14:16     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #1
Добрый день.
Помогите немного подкорректировать код.
В main'е switch'ом выбирается 3 пользовательских варианта:
1.Вычисление определителя матрицы;
2.Вычисление корней системы линейных уравнений;
3.0-для выхода из этой безнадежной программы =)

С вычислением корней системы линейных уравнений проблема.
Определитель вроде сносно отрабатывает.
Пытаюсь "засечь" скорость выполнения алгоритма нахождения определителя.
На выходе - стабильно "0".

Код:
Код
#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);
void showInputMatrix_Vector(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf);
                    
double determinant(std::vector< std::vector<double> >& matrix);
void slau_funct(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf, std::vector<double> lx);
int main(int argc, char *argv[])
{
    
    int choice;
    double dtm;
    //clock_t time;
         
   showMenu();
   cin>>choice;
   
   while(choice != 0){
   switch(choice)
   {
     case 1:{
          vector<vector<double> > square_matrix; 
          vector<double> line;
          int n; 
          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;
               line.push_back(temp);                  
                cout<<"Vvedite znachenie:\n";
             }
      
            square_matrix.push_back(line);
          }
    
          showInputMatrix(square_matrix);
          //time = clock();
          dtm = determinant(square_matrix);
          //time = clock() - time;
          cout<<"Determinant = ";
          dec(cout);
          cout<<dtm<<endl;
          //cout<<"time: "<<time/CLOCKS_PER_SEC<<endl;
     break;}//end case 1
    
     case 2:{
          vector<vector<double> > slau_matrix; 
          vector<double> line2;
          vector<double> line_x;
          vector<double> line_f;    // *****slau_matrix * line_x = line_f*****
    
        int m,i2,j2;
        double temp2;
        double temp_f;
        cout<<"Vvedite razmernost' matrix:\n";
        cin>>m;
        cout<<"Vvedite znacheniya v matrix:\n";
           for( i2=0;i2<m;i2++)
           {
             line2.clear();             //ochishaem vector line
             line_x.clear();           //ochishaem vector line_x
             for(j2=0;j2<m;j2++)
             {
                cin>>temp2;
                line2.push_back(temp2);                  
                cout<<"Vvedite znacheniya v matrix:\n";
             }
      
            slau_matrix.push_back(line2);    //sozdaem 2merny massiv
           }
    
            cout<<"Vvedite znacheniya v vector_f (znachenia dlya funczcii_f):\n";
            for(i2=0;i2<m;i2++)
            {
               cin>>temp_f;
               line_f.push_back(temp_f);      //zanosim znachenia v vector line_f
               cout<<"Vvedite znacheniya v vector_f (znachenia dlya funczcii_f):\n";
            }
    
         showInputMatrix_Vector(slau_matrix, line_f);
         slau_funct(slau_matrix, line_f, line_x);
         
        /* cout<<"Naidennie znachenia x:\n";
         for(i2=0;i2<line_x.size();i2++)
         {
                cout<<line_x[i2]<<"|";
         }*/
         
     break;}//end case 2
     
     default :
            cout<<"exit...\n";
     break;   
   }//end switch
  
   showMenu();
  cin>>choice;
}//end while 


    system("PAUSE");
    return EXIT_SUCCESS;
}

//################opredelenie Function's##################
void showInputMatrix(std::vector< std::vector<double> > matrix)
{    int i,j;
     cout<<"Matrix\n";
       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 showInputMatrix_Vector(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf)
{       
      int i,j;
        cout<<"Sistema lineynih uravneniy\n";
          for(i=0;i<sl_matrix.size();i++)
          {
            for(j=0;j<sl_matrix.size();j++)
            { 
              dec(cout);
              cout.width(11);
              cout.precision(10);
              cout<<sl_matrix[i][j]<<"|";
            }
           cout<<endl;
          } 
           
           for(j=0;j<lf.size();j++)   //vivod vectora line_f
            { 
              dec(cout);
              cout.width(11);
              cout.precision(10);
              cout<<lf[j]<<"\n";
            } 
            
}


void showMenu()
 {
    cout<<"vvedite 1,2 ili 0:\n"
    "1 - Vichislyaem opredelitel matrizcy\n"
    "2 - Reshaem sistemu lineinih uravneny\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<<"time: "<<((double)clock() - time_on)/CLOCKS_PER_SEC<<endl;
        return koef;
}


void slau_funct(std::vector< std::vector<double> > sl_matrix, std::vector<double> lf, std::vector<double> lx)
{   //nahodim korni x1,x2,...xn  v  s.l.a.u. 
    int n = lx.size();
    int l = n - 1;
    int j;
    int m;
    int i2;
    double sum;
    lx[l] = lf[l] / sl_matrix[l][l];     // *****slau_matrix * line_x = line_f*****
    for(m = l-1; m > -1; m--)    
    {
      sum = 0;
         for(j = m+1; j < n; j++) 
         {  
          sum = sum + (sl_matrix[m][j] * lx[j]);   
         }
    
      lx[m] = ( 1 /  sl_matrix[m][m]  ) * ( lf[m]  -  sum );
      cout<<endl;
      cout<<lx[m]<<"|";
    }
    
}
Перечисление небольшой суммы на wmz гарантирую.
Вложения
Тип файла: rar opredelitel.rar (197.1 Кб, 14 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2011, 14:16     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3
Посмотрите здесь:

Формула для нахождения определителя матрицы C++
Написать функцию для нахождения определителя квадратной матрицы C++
C++ Сделать класс для вычисления определителя
C++ Функция нахождения определителя матрицы с вычислением времени
C++ Написать функцию для вычисления определителя матрицы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 14:26     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #2
Размерность матрицы какую задаёшь?
Чтобы успеть "засечь" хотя бы 1000х1000 задай.
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 14:37  [ТС]     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Размерность матрицы какую задаёшь?
Чтобы успеть "засечь" хотя бы 1000х1000 задай.
Я в ручную заношу данные)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 14:42     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #4
Можешь на пальцах прикинуть, сколько операций выполняется для поиска определителя?
И сколько тактов процессора выполняется за 1/1000 секунды?
И как замерить промежуток времени, который меньше 1/1000 при помощи time?
И главное, какая разница, сколько это займёт времени, если временной промежуток столь маг, что его нельзя измерить.)
Если хочешь реально проверить изменение производительности используй матрицу большой размерности. На самом деле и 1000х1000 это маленькая матрица.
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 14:54  [ТС]     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #5
Попробовал.
Затянулся процесс...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 15:06     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #6
100х100
silent_1991
27.03.2011, 15:07
  #7

Не по теме:

Цитата Сообщение от USHЁL Посмотреть сообщение
Я в ручную заношу данные)
И какой же способ от этого отойти? Эм... Может быть, заполнять матрицу автоматически, с использованием генератора случайных чисел?

USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 15:25  [ТС]     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #8
Дело в том,что изначально я задумывал програму как вычисление определителя для,введенных пользователем матриц.
Со временем добавился вопрос с нахождением времени выполнения алгоритма.
Щас подправлю

Добавлено через 4 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
100х100
100*100 задал.На выходе всё по нулям.
Код
 for(int i=0;i<n;i++)
          {
            line.clear();
             for(int j=0;j<n;j++)
             {
               //cin>>temp;
               temp = rand();
               line.push_back(temp);                  
                //cout<<"Vvedite znachenie:\n";
             }
      
            square_matrix.push_back(line);

Вывод для 100 на 100 матрицы:
time:0.031
Determinant = -inf <-----wtf?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 15:27     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #9
Это лаба или для себя?
Если для себя, то в сети есть куча библиотек для работы с матрицами. Там в стопицот раз оптимальнее реализовано, чем ты сможешь сам написать.)

Добавлено через 29 секунд
Цитата Сообщение от USHЁL Посмотреть сообщение
100*100 задал.На выходе всё по нулям.
500х500
.)
silent_1991
27.03.2011, 15:32
  #10

Не по теме:

Цитата Сообщение от USHЁL Посмотреть сообщение
Дело в том,что изначально я задумывал програму как вычисление определителя для,введенных пользователем матриц
Да, этот факт кардинально всё меняет... Ведь компилятор не допускает больше одного изменения кода в неделю...
Это я к тому, что можно сначала сменить ввод на автоматически, а потом обратно на ручной.

USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 15:34  [ТС]     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #11
Это лаба.
Нужно как бы и самому немного подразобраться.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 15:35     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #12
А считает определитель правильно?
Это должен быть первый вопрос.)
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 15:37  [ТС]     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #13
=)
А вот мне то как раз не до шуток.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 15:39     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #14
Цитата Сообщение от USHЁL Посмотреть сообщение
Определитель вроде сносно отрабатывае
ТАк какая тебе разница, сколь мало времени на это уходит.)
Или по заданию засечь надо? Тогда размер матрицы увеличивай. Постепенно.
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 15:49  [ТС]     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #15
мне потом нужен письменный отчёт составлять по этому методу.

И график чертить зависимости размерности от времени,хотябы для 3-4 случаев.
Это реально как Вы считаете или надомной поглумился инопланетный препод(прошу прошения за ненорматив)?=)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 16:00     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #16
Чтобы засечь время матрица должна быть относительно большая.
График чертить смысл очень есть - зависимость нелинейная.
Размерность матрицы увеличивай, чтобы и измерить успеть и не сидеть пол дня.
USHЁL
 Аватар для USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 16:11  [ТС]     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #17
Благодаря Вам понял,что дело в размерности.
Не понятен вывод после ввода матрицы 1000 на 1000
На выходе Detrminant = -inf
Что это означает?

Для матрицы 1000*1000
time = 31.797
Для матрицы 1111*1111
time = 43.547
Determinent = inf

Как Вы считаете код сносно реализован или нужно менять?

main:
Код
for(int i=0;i<n;i++)
          {
            line.clear();
             for(int j=0;j<n;j++)
             {
               //cin>>temp;
               temp = rand();
               line.push_back(temp);                  
                //cout<<"Vvedite znachenie:\n";
             }
      
            square_matrix.push_back(line);
          }
determinant:
Код
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<<"time: "<<((double)clock() - time_on)/CLOCKS_PER_SEC<<endl;
        return koef;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2011, 17:10     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3
Еще ссылки по теме:

Код для нахождения определителя матрицы N на N исключением строки и столбца C++
И снова класс Матрицы с функция-член класса для нахождения определителя C++
Создать функцию для вычисления определителя матрицы 2х2 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 17:10     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3 #18
Это либо переполнение, либо были не инициализированные данные. Или деление на ноль было.
Yandex
Объявления
27.03.2011, 17:10     Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3
Ответ Создать тему
Опции темы

Текущее время: 20:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru