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

Оптимизация алгоритма вычисления определителя матрицы - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Даны N предложений. Подсчитать количество слов в каждом предложении и вывести на печать http://www.cyberforum.ru/cpp-beginners/thread774396.html
Здравствуйте. Помогите, пожалуйста, в написании алгоритма на C++. >>Даны N предложений. Подсчитать количество слов в каждом предложении и вывести на печать.<< Спасибо заранее добрым людям!
C++ Как закрыть документ Word не закрывая приложение? Удалить из заданной строки все вхождения "*". Надеюсь, что с вашей помощью я таки пойму строковые данные на паскаль! http://www.cyberforum.ru/cpp-beginners/thread774395.html
Вложенные циклы и необъявленные идентификаторы C++
есть часть кода: for(int a=0; a<3;a++) if (a=0) int b=1; else if (a=1) int b=2; else if (a=2) int b=3; for(int c=0; c<3;c++) if (c=0) int d=1; else if (c=1) int d=2; else if (c=2) int d=3;
Хеширование-метод середины квадрата C++
Вот такая ситуация... Тип данных строки, метод разрешения колизии "открытая адресация". Проблема в самой хеш-функции, прочитал много теории, но никак не выходит теорию в жизнь воплатить =) Вот что есть: int _key(char* ch0) { int key; key=strlen(ch0); return key; }
C++ Почему делают такие комментарии к программе C++? http://www.cyberforum.ru/cpp-beginners/thread774272.html
В исходнике к одной игре все комментарии начинаются вот такими сомволами ///< struct _viewport_ { int X; ///< Screen pixel left corner x coordinate int Y; ///< Screen pixel upper corner y coordinate int EndX; ///< Screen pixel right x coordinate int EndY; ///< Screen pixel bottom y coordinate int MapX; ...
C++ Скомпилировать 5 проектов *.CPP в *.EXE Ребят, нужна помощь! Нужно срочно скомпилировать 5 С++ проектов в EXE - у меня Eclipse загнулся, не могу ничего поделать - нужна помощь подробнее

Показать сообщение отдельно
mamrenko_
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 1
30.05.2014, 12:25     Оптимизация алгоритма вычисления определителя матрицы
-=ЮрА=-, можешь перевести код на с++? очень надо до понедельника. Спасибо большое
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
//Функция находит минор матрицы arr для элемента
//с индексами строки im столбца jm
double **M(int m, int im, int jm, double ** arr)
{
    int i, j;
    printf("Minor : m = %02d im = %02d, jm = %02d\n", m, im, jm);
    double ** ret = (double **)malloc((m - 1)*sizeof(double));
    for(i = 0; i < m; i++)
    {
        if(i != im)
        {
            if(i < im)
                ret[i]     = (double *)malloc((m - 1)*sizeof(double));
            else
                ret[i - 1] = (double *)malloc((m - 1)*sizeof(double));
            for(j = 0; j < m; j++)
            {
                if(j != jm)
                {
                    if(i < im)
                    {
                        if(j < jm)
                            printf("%.0f ",(ret[i][j] = arr[i][j]));
                        else
                            printf("%.0f ",(ret[i][j - 1] = arr[i][j]));
                    }
                    else
                    {
                        if(j < jm)
                            printf("%.0f ",(ret[i - 1][j] = arr[i][j]));
                        else
                            printf("%.0f ",(ret[i - 1][j - 1] = arr[i][j]));
                    }
                }
            }
            printf("\n");
        }
    }
    return ret;
}
 
//Функция возвращает детерминант матрицы
//В функции всё понятно кроме iShowStepsOfCalcs 
//iShowStepsOfCalcs - это флаг отвечающий за то чтобы
//светить или нет в консоли результаты промежуточных вычислений
//Вообще вывод промежуточных вычислений полезнаяя штука для понимания
//работы рекурсии, кому понтравится может перенаправить вывод
//промежуточных результатов в файл. Единственный минус промежуточной индика
//ции - существенное увелечиние времени вычислений
double Det(int m, double ** arr, int iShowStepsOfCalcs)
{
    int i, j = 0;
    double ret = 0;
    double A;
    double ** _arr;
    if(m == 2)//В случаем 2х2 вычисляем детерминант сразу
    {
        ret = 
            arr[0][0]*arr[1][1] - 
            arr[1][0]*arr[0][1];
        if(iShowStepsOfCalcs)
            printf("Det = %lf\n",ret);
        
    }
    else//Иначе находим детерминант рекурсивно
    //через алгебраическое дополнение элемента
    {
        for(j = 0; j < m; j++)
        {
            _arr = M(m, 0, j, arr);
            ret += (A = (arr[0][j])*pow(-1,j)*Det(m - 1, _arr, iShowStepsOfCalcs));
            if(iShowStepsOfCalcs)
                printf("A[%02d][%02d] = %lf\n",1, j + 1,A);
            for(i = m - 2; 0 < i; i--)
                free((void *)_arr[i]);
            free((void *)_arr);
        }
    }
    return ret;
}
 
int main()
{
    int i, j, m;
    //По умолчанию ставлю светить результаты
    int iShowStepsOfCalcs = 1;//промежуточных вычислений
    printf("Enter m : ");scanf("%d",&m);
    time_t t;srand(time(&t));
    //Выделяем память под строки массива
    double ** array = (double **)malloc(m*sizeof(double));
    double det = 0;//Будет содержать в себе результат вычислений
    for(i = 0; i < m; i++)
    {
        //Выделяем память под элементы строки
        array[i] = (double *)malloc(m*sizeof(double));
        for(j = 0; j < m; j++)
        {
            //Будут как отр так и положит элементы
            array[i][j] = (1.0*(rand()%100) - 50)/10;
            //Я немного модернизировал вывод чтобы
            //отрицательные и положительные печатались ровно
            printf
            (
                (array[i][j] < 0 ? "-%.1f " : " %.1f "),
                fabs(array[i][j])
            );
        }
        printf("\n");
    }
    system("pause");
    det = Det(m,array,iShowStepsOfCalcs);
    system("cls");//Очищаем экран
    //Заново печатаем элементы матрицы(можно и не делать, 
    //повторный вывод ввёл просто для удобства пользования
    //Ну и заодно чистим память
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < m; j++)
        {
            printf
                (
                    (array[i][j] < 0 ? "-%.1f " : " %.1f "),
                    fabs(array[i][j])
                );
        }
        printf("\n");
        free((void *)array[i]);
    }
    printf("Determiant : %lf\n",det);
    system("pause");
    return 0;
}
 
Текущее время: 04:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru