3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
1

Нужно ускорить код

16.09.2011, 19:08. Показов 1897. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне нужно написать программу, для преобразования коэффициентов системы и столбца свободных членов к виду, необходимому для импорта в матпакет.


Приведу наглядный пример на системе из 2-х уравнений:
х_1 + 345,45х_2 = 6,3
х_2 = 4
Матрица коэффициентов в этом случае выглядит вот так:
(1;1)(2;345,45)
(2;1)
Столбец свободных членов выглядит вот так:
6,3
4

В ней только ненулевые коэффициенты.
тут первое число в скобке - это номер коэффициента, второе число в скобке - значение коэффициента, стоящего перед соответствующие переменные. Номер строчки - номер уравнения.

Мне же надо разбить эту матрицы на 2 текстовых файла - в одном - координаты неотрицательных элементов, в другом - значения коэффициентов перед соответствующими переменными. Попутно нужно заменять запятые - точками. А в 3-ий просто переписать столбец свободных членов, но уже заменив все запятые на точки

Вот что должно получиться к приведенному выше примеру:
а-1 - координаты коэффициента
1 1
1 2
2 1

а-2 - значения соответствующих коэффициентов:
1
345.45
1

Столбец свободных членов:
6.3
4

Вот сам код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
#include <iomanip>
 
using namespace std;
 
int main()
{
    //-------------------------------------------------------------
    // Приведение столбца свободных членов к виду, необходимому для
    // импорта в SCILab
    // b.txt - исходный столбец
    // bb.txt - искомый столбец
    //-------------------------------------------------------------
    ifstream ifsb ("b.txt");
    ofstream ofsb ("bb.txt");
    char q;
    while( !ifsb.eof() )
    {
        q = ifsb.get();
        if ( ifsb.eof() ) break;
        if ( q == ',' ) { ofsb << "."; }
        else { ofsb << q; }
    }
    ifsb.close();
    ofsb.close();
    //------------------------------------------------------------
    // Приведение матрицу коэффициентов к виду, необходимому для 
    // импорта в матпакет.
    // a.txt - исходная матрица коэффициентов
    // a-1.txt - содержит координаты ненулевых членов
    // а-2.txt - соджержит соотвествующие коэффициенты
    //------------------------------------------------------------
    
    ifstream ifsa ("a.txt");
    ofstream ofsa_1 ("a-1.txt");
    ofstream ofsa_2 ("a-2.txt");
 
    char w;
    int stroka = 1;
    int k = 0;
    ofstream* ptr = &ofsa_1;
    std::string t = "1234567890";
    while ( !ifsa.eof() )
    {
        w = ifsa.get();
        if ( ifsa.eof() ) break;
        if ( w == '(' ) { ptr = &ofsa_1; *ptr << stroka << " "; continue; }
        if ( w == ')' ) { ofsa_2 << endl; }
        if ( w == ',' ) { ofsa_2 << "."; } 
        if ( w == '\n' ) { stroka++; }
        if ( w == ';' ) { *ptr << endl; ptr = &ofsa_2; }
        if ( t.find(w) != t.npos ) 
        { 
            *ptr << w; 
        }
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2011, 19:08
Ответы с готовыми решениями:

Нужно ускорить код. Буду очень благодарен
Условие задачи: Вводиться число n, затем вводятся n чисел. Нужно с последней введенной цифры до...

Как ускорить код?
Есть код : #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;memory.h&gt; #include &lt;iostream&gt; using...

Деление больших чисел (нужно ускорить)
Ребятки, помогите ускорить. Уж очень медленно. Класс совсем простой(вектор со знаком): static...

Гипотеза Коллатца(ускорить код)
Существует вот такая вот гипотеза Коллатца(https://ru.wikipedia.org/wiki/Гипотеза_Коллатца),...

20
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.09.2011, 19:25 2
А что тут ускорять? И главное, зачем?
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 19:33  [ТС] 3
Может есть способы оптимизировать работу кода? Мне нужно максимально быстрое время работы программы..
0
Заблокирован
Автор FAQ
16.09.2011, 20:28 4
Цитата Сообщение от hello19 Посмотреть сообщение
Может есть способы оптимизировать работу кода? Мне нужно максимально быстрое время работы программы..
- неужели всё с той СЛАУ бьёшся???
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:30  [ТС] 5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- неужели всё с той СЛАУ бьёшся???
ну не над той)
0
Заблокирован
Автор FAQ
16.09.2011, 20:33 6
Цитата Сообщение от hello19 Посмотреть сообщение
ну не над той)
- а можешь своими словами суть проблеммы рассказать???
Может этого Гаусса в разработку возьмёшь???
Методом Гаусса решить систему n линейных алгебраических уравнений
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:37  [ТС] 7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а можешь своими словами суть проблеммы рассказать???
Может этого Гаусса в разработку возьмёшь???
Методом Гаусса решить систему n линейных алгебраических уравнений
В принципе можно поробовать)
Ну а теперь непосредственно про проблему: я нашел отличный матпакет, который помогает решить систему уравнений довольно быстро... НО! для этого ему нужно, чтобы исходные данные имели определенный вид. Собственно для этого то я и написал прогу, приведенную в топике. Вот только нужно, чтобы скорость ее работы была как можно быстрее...

Думаю, алгоритм, который я реализовал - не самый быстрый. Я просто прохожу по каждому элементу, а это накладно виду огромного количества коэффициентов. Да и не уверен я, что реализация алгоритма самая шустрая... Так что вот.
0
Заблокирован
Автор FAQ
16.09.2011, 20:44 8
Цитата Сообщение от hello19 Посмотреть сообщение
для этого ему нужно, чтобы исходные данные имели определенный вид.
Какой??Как те коэффициенты матрицы А в СЛАУ, давай я сейчас тоже подумаю, просто твой алгоритм уже рабочий, думаю врядли его ускоришь, нужен концептуально другой подход
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:45  [ТС] 9
Рабочий это да.. вот только может реализация алгоритма не самая шустрая...
Новый подход? мб мб.. хотя хз хз)
0
Заблокирован
Автор FAQ
16.09.2011, 20:54 10
Цитата Сообщение от hello19 Посмотреть сообщение
х_1 + 345,45х_2 = 6,3
- мне не понятна запись, ошибки нет???

Добавлено через 1 минуту

Цитата Сообщение от hello19 Посмотреть сообщение
х_1 + 345,45х_2 = 6,3
- ааа всё допёр
1*х1 + 345,45*х2 = 6,3, ок сейчас поколдую
2
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:57  [ТС] 11
а что не так? Что не понятно?

Добавлено через 2 минуты
Кстати - тут немного времени потратил на то, чтобы узнать, как быстрее выводить в файл - с помощью printf или ofstream. Вообщем к конечному выводу так и не пришел... говорят, что printf по шустрее.. хз... насколько я понял, методы ofsteram реализованы через prinf... может это что нить значит?
0
Заблокирован
Автор FAQ
16.09.2011, 20:58 12
hello19, жди я в работе
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:59  [ТС] 13
спасибо, конечно.. но мне тоже хочется попрогать)))))
0
Заблокирован
Автор FAQ
16.09.2011, 21:29 14
hello19, пробуй(как по мне так на лету всё делается, привожу исходную А и полученные а-1(2))
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <windows.h>
#include <stdio.h>
 
void UpdateString(FILE *f1, FILE *f2, char * s, long lRow);
 
int main()
{
    char * str, *buf;
    long sLen,lRow = 1;
    FILE * f = fopen("A.txt","rb+");
    FILE * f1, *f2;
    if(!f)
        printf("Error open A.txt\r\n");
    else
    {
        //Получаю длину файла
        fseek(f,0,SEEK_END);
        sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        if(!(str = (char *)malloc((sLen + 1)*sizeof(char))))
            printf("Allocation memory error\r\n");
        else
        {
            fread(str,sLen,1,f);
            str[sLen] = '\0';
        }
        fclose(f);
        if(str)
        {
            f1 = fopen("a-1.txt","wb+");
            f2 = fopen("a-2.txt","wb+");
            if(!f1 || !f2)
                printf("Error open a-1(2).txt\r\n");
            else
            {
                buf = strrchr(str,'\n');//Разбиваю str на строки
                sLen = 1;//Тут уже юзаю sLen как счётчик строк
                while(buf)
                {
                    UpdateString(f1, f2, buf, lRow);
                    str[sLen - strlen(buf)] = '\0';
                    sLen = strlen(str);
                    buf = strrchr(str,'\n');
                    lRow++;
                }
                if(str)
                    UpdateString(f1, f2, buf, lRow);
                fclose(f1);
                fclose(f2);
                printf("Transforming complete\r\n");
            }
        }
    }
    return 0;
}
 
void UpdateString(FILE *f1, FILE *f2, char * s, long lRow)
{
    long sLen,lCol = 1;
    char * str, *buf;
    char delim[] = " ;";
    double val;
    if(s)
    {
        sLen = strlen(s);
        str = (char *)malloc((sLen + 1)*sizeof(char));
        sprintf(str,"%s",s);
        str[sLen] = '\0';
 
        buf = strtok(str,delim);
        while(buf)
        {
            if((val = atof(buf)) != 0)
            {
                fprintf(f1,"%u %u\r\n",lRow,lCol);
                fprintf(f2,"%lf\r\n",val);
            }
            lCol++;
            buf = strtok(NULL,delim);
        }
    }
}
Вложения
Тип файла: txt A.txt (62 байт, 8 просмотров)
Тип файла: txt a-1.txt (105 байт, 8 просмотров)
Тип файла: txt a-2.txt (215 байт, 7 просмотров)
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
22.09.2011, 16:03  [ТС] 15
ну как оно???
0
Заблокирован
Автор FAQ
22.09.2011, 16:13 16
Цитата Сообщение от hello19 Посмотреть сообщение
ну как оно???
-всмысле???)
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
22.09.2011, 17:11  [ТС] 17
спокойно))) просто не разглядел кода.. не выспался....

Добавлено через 48 минут
слушай, ты не знаешь как грамотно можно засечь время работы кода??
0
Заблокирован
Автор FAQ
22.09.2011, 17:43 18
Цитата Сообщение от hello19 Посмотреть сообщение
слушай, ты не знаешь как грамотно можно засечь время работы кода??
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
 
void sort(int [],int);
void print(int [], int);
 
int main()
{
    time_t start;
    time_t end;
 
    int i,n;
    double s=1;
    srand(time(0));
 
    cout<<"Enter size of array: ";
    cin>>n;
 
    n=((n>0 && n<=100) ? n : 5);
 
    int *arr=new int [n-1];
    
    time(&start);
    tm * ptm = localtime(&start);
    printf("ALGORITHM START AT : %s\r\n",asctime(ptm));
    for(i=0;i<n;i++)
        arr[i]=1+rand()%20;
 
    print(arr,n);
    sort(arr,n);
    print(arr,n);
 
    for(i=1;i<n-1;i++)
        s=s*arr[i];
 
    cout<<"\nS = "<<s<<endl;
 
    time(&end);
    ptm = localtime(&end);
    printf("ALGORITHM ENDS AT : %s\r\n",asctime(ptm));
    printf("DIFERENTS IN CLOCKS_PER_SEC : %d\r\n",end - start);
    printf("NUM OPERATIONS / CLOCKS_PER_SEC %lf\r\n",1.0*(i + 2)/CLOCKS_PER_SEC);
    printf("Press any key to continue\r\n");
    getch();
    return 0;
}
 
void sort(int a [],int size)
{
    int temp;
    for (int i = 0; i < size-1; i++)        // Проход всего массива кроме последнего элемента
    for (int j = i + 1; j <= size-1; j++)   // Проход оставшейся части массива
        if (a[i] > a[j])
        {
            // Сравнение текущего элемента с элементом из оставшейся части.
            temp = a[i]; // Обмен значений элементов если они стоят в неправильном порядке
            a[i] = a[j];
            a[j] = temp;
        }
}
 
void print(int b[], int x)
{
    cout<<endl;
 
    for(int i=0;i<x;i++)
        cout<<b[i]<<" ";
    cout<<endl;
}
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
22.09.2011, 17:45  [ТС] 19
уже сделал что то подобное...
0
Заблокирован
Автор FAQ
22.09.2011, 17:49 20
Цитата Сообщение от hello19 Посмотреть сообщение
уже сделал что то подобное...
и ???
0
22.09.2011, 17:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2011, 17:49
Помогаю со студенческими работами здесь

Код работает долго, нужно ускорить
Программа считает, сколько в среднем времени занимает процедура. На 1 000 итераций и массиве в 1...

Нужно ускорить или уменьшить код
Программа находит определенное количество подмножеств заданного множества Нужно ее либо ускорить...

Нужно ускорить процесс
Делаю фильтр к таблице AdvStringGrid, на подобии Excel. При открытии фильтра нужно пробежаться по...

Ускорить код)
Есть одна олимпиада на codeforces, но не в том дело. Так вот, одно из заданий (есть во вложениях)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru