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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
#1

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

27.03.2011, 14:16. Просмотров 1379. Ответов 17
Метки нет (Все метки)

Добрый день.
Помогите немного подкорректировать код.
В 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 гарантирую.
0
Вложения
Тип файла: 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++
Здравствуйте! У меня имеется небольшой вопрос: как записать формулу для нахождения определителя матрицы(ранг&gt;2) на с++? Считать...

Написать функцию для нахождения определителя квадратной матрицы - C++
Здравствуйте! Помогите, пожалуйста, написать функцию для нахождения определителя квадратной матрицы

Код для нахождения определителя матрицы N на N исключением строки и столбца - C++
Подскажите пожалуйста код для нахождения определителя матрицы N на N исключением строки и столбца

Сделать класс для вычисления определителя - C++
как сделать чтобы было универсально ? xотя - бы до 5 пока только до этого додумался :) double SolveDeterm(int ** Elements,int...

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

Не по теме:

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

0
USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
27.03.2011, 15:25  [ТС] #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?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 15:27 #9
Это лаба или для себя?
Если для себя, то в сети есть куча библиотек для работы с матрицами. Там в стопицот раз оптимальнее реализовано, чем ты сможешь сам написать.)

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

Не по теме:

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

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

И график чертить зависимости размерности от времени,хотябы для 3-4 случаев.
Это реально как Вы считаете или надомной поглумился инопланетный препод(прошу прошения за ненорматив)?=)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2011, 15:49
Привет! Вот еще темы с ответами:

Метод Гаусса для вычисления определителя - C++
Вычисляю обратную матрицу методом Гаусса. После приведения к верхнетреугольному виду считаю определитель, однако значение выдается...

Написать функцию для вычисления определителя матрицы - C++
Нужна функция для вычисления ОПРЕДЕЛИТЕЛЯ матрицы, аргументами которой будет количество строк в матрице N и сама матрица. п.с. или ссылку...

Создать функцию для вычисления определителя матрицы 2х2 - C++
Создать функцию для вычисления определителя матрицы 2х2. (в C++) HELP ME PLEASE

Программа для вычисления значений функции F(x) на отрезке [a,b] с шагом h (Dev-C++) - C++
F(x)=7{sin}^{2}x-\frac{1}{2}cosx a, b, h - вводит пользователь. Результат выводится в таблице. Первый столбец - значение аргумента,...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
27.03.2011, 15:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru