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

Как расширить работоспособность программы - C++

Восстановить пароль Регистрация
 
bolshakovinka
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 15
13.12.2012, 02:09     Как расширить работоспособность программы #1
Подскажите пожалуйста как сделать так чтобы программа работала при бОльших значениях...Вот у меня имеется программа для рекурсивного умножения матриц..Но она считает значения только для размера не больше тридцати двух.Далее отказывается компилировать
Как сделать так,чтобы она умножала матрицы огромного размера(например 1024х1024)?Прикладываю код:
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <locale>
 
using namespace std ;
 
#define n 16 //ближайшая степень двойки
#define s 12 // наш размер матрицы
 
long int strassen(long int (&A)[n][n],long int (&B)[n][n],long int (&C)[n][n],long int half);
long int multi(long int (&MA)[n][n],long int (&MB)[n][n],long int (&MC)[n][n]);
long int add(long int (&AM)[n][n],long int (&BM)[n][n],long int (&CM)[n][n],long int segment);
long int sub(long int (&AM1)[n][n],long int (&BM1)[n][n],long int (&CM1)[n][n],long int seg);
int main()
{   
    setlocale(LC_ALL, "Russian");
    unsigned int start_time =  clock(); // начальное время
    long int a[n][n], b[n][n], c[n][n] ;
    long int A[s][s], B[s][s], C[s][s] ;
    int i,j ;
    for (i=0;i<s;i++)
    {
        for (j=0;j<s;j++)
        {
            A[i][j] = 1;
            B[i][j] = 1;
            C[i][j] = 0;
        }
    }
    
    for ( i = 0 ; i < n ; i ++ )
        for ( j = 0 ; j < n ; j ++ )
        {
            a[i][j] = 0 ;
            b[i][j] = 0 ;
            c[i][j] = 0 ;
        }
    for ( i = 0 ; i < s ; i ++ )
        for ( j = 0 ; j < s ; j ++ )
        {
            a[i][j] = A[i][j] ;
            b[i][j] = B[i][j] ;
            c[i][j] = C[i][j] ;
        }
    
    long int size = n;
    strassen(a,b,c,size);
    for (i=0;i<s;i++)
    {
        for (j=0;j<s;j++)
        {
    
           cout << c[i][j] << "  ";
        }
        cout << endl;
    }
    cout<<" Время выполнения данной программы:  ";
    unsigned int end_time = clock(); // конечное время
    unsigned int search_time = end_time - start_time; // искомое время
    cout<< search_time;// время выполнения программы
    system("pause");
    return 0;
}
long int strassen(long int (&A)[n][n],long int (&B)[n][n],long int (&C)[n][n],long int half)
{
    half=half/2;
    if (half!=1)
    {
        long int full = half*2;
        long int A11[n][n],A12[n][n],A21[n][n],A22[n][n],B11[n][n],B12[n][n],B21[n][n],B22[n][n],C11[n][n],C12[n][n],C21[n][n],C22[n][n],P1[n][n],P2[n][n],P3[n][n],P4[n][n],P5[n][n],P6[n][n],P7[n][n],Result1[n][n],Result2[n][n];
       
    for (int i = 0; i < half; i++)
{
        int k = i + half;
        for (int j = 0; j < half; j++)
            {
                 int l = j + half;
                A11[i][j] = A[i][j];
                A12[i][j] = A[i][l];
                A21[i][j] = A[k][j];
                A22[i][j] = A[k][l];
       
                B11[i][j] = B[i][j];
                B12[i][j] = B[i][l];
                B21[i][j] = B[k][j];
                B22[i][j] = B[k][l];
        
    }
}
     
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
        add(A11,A22,Result1,half);
        add(B11,B22,Result2,half);
        strassen(Result1,Result2,P1,half);
        //////////////////////////////
        add(A21,A22,Result1,half);
        strassen(Result1,B11,P2,half);
        //////////////////////////////
        sub(B12,B22,Result1,half);
        strassen(A11,Result1,P3,half);
        //////////////////////////////
        sub(B21,B11,Result1,half);
        strassen(A22,Result1,P4,half);
        //////////////////////////////
        add(A11,A12,Result1,half);
        strassen(Result1,B22,P5,half);
        //////////////////////////////
        sub(A21,A11,Result1,half);
        add(B11,B12,Result2,half);
        strassen(Result1,Result2,P6,half);
        //////////////////////////////
        sub(A12,A22,Result1,half);
        add(B21,B22,Result2,half);
        strassen(Result1,Result2,P7,half);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        add(P1,P4,Result1,half);
        sub(P5,P7,Result2,half);
        sub(Result1,Result2,C11,half);
        /////////////////////
        add(P2,P4,C21,half);
        /////////////////////
        add(P3,P5,C12,half);
        ////////////////////
        sub(P1,P2,Result1,half);
        add(P3,P6,Result2,half);
        add(Result1,Result2,C22,half);
        ///////////////////
       for (int i = 0; i < half ; i++)
    {
        int k = i + half;
        for (int j = 0 ; j < half; j++)
            {
                int l = j + half;
                C[i][j] = C11[i][j];
                C[i][l] = C12[i][j];
                C[k][j] = C21[i][j];
                C[k][l] = C22[i][j];
            }
    }
}
    else
    {
        multi(A,B,C);
    }
    return 0;
}
long int multi(long int (&MA)[n][n],long int (&MB)[n][n],long int (&MC)[n][n])
{
    long int p1 = (MA[0][0]+MA[1][1])*(MB[0][0]+MB[1][1]);
    long int p2 = (MA[1][0]+MA[1][1])*MB[0][0];
    long int p3 = MA[0][0]*(MB[0][1]-MB[1][1]);
    long int p4 = MA[1][1]*(MB[1][0]-MB[0][0]);
    long int p5 = (MA[0][0]+MA[0][1])*MB[1][1];
    long int p6 = (MA[1][0]-MA[0][0])*(MB[0][0]+MB[0][1]);
    long int p7 = (MA[0][1]-MA[1][1])*(MB[1][0]+MB[1][1]);
    MC[0][0] = p1+p4-p5+p7;
    MC[0][1] = p3+p5;
    MC[1][0] = p2+p4;
    MC[1][1] = p1-p2+p3+p6;
    return 0;
}
long int add(long int (&AM)[n][n],long int (&BM)[n][n],long int (&CM)[n][n],long int segment)
{
    int i,j;
    for (i=0;i<segment;i++)
    {
        for (j=0;j<segment;j++)
        {
            CM[i][j] = AM[i][j] + BM[i][j];
        }
    }
    return 0;
}
long int sub(long int (&AM1)[n][n],long int (&BM1)[n][n],long int (&CM1)[n][n],long int seg)
{
    int i,j;
    for (i=0;i<seg;i++)
    {
        for (j=0;j<seg;j++)
        {
            CM1[i][j] = AM1[i][j] - BM1[i][j];
        }
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2012, 02:09     Как расширить работоспособность программы
Посмотрите здесь:

как расширить массив C++
C++ Как можно расширить STL своим набором функций?
C++ Проверить программу на работоспособность
C++ Как расширить консольное окно
C++ Как расширить класс в С++?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
13.12.2012, 02:13     Как расширить работоспособность программы #2
Выделять память динамически.
bolshakovinka
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 15
13.12.2012, 02:21  [ТС]     Как расширить работоспособность программы #3
А без выделения динамической памяти никак не сделать да?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
13.12.2012, 02:24     Как расширить работоспособность программы #4
Цитата Сообщение от bolshakovinka Посмотреть сообщение
А без выделения динамической памяти никак не сделать да?
Стек не резиновый.
bolshakovinka
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 15
13.12.2012, 02:26  [ТС]     Как расширить работоспособность программы #5
Сильно это на изменениях в программе скажется?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
13.12.2012, 02:27     Как расширить работоспособность программы #6
Цитата Сообщение от bolshakovinka Посмотреть сообщение
Сильно это на изменениях в программе скажется?
Не очень.
bolshakovinka
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 15
13.12.2012, 15:56  [ТС]     Как расширить работоспособность программы #7
Кто нибудь может отредактировать мою программу.сделать динамическое выделение памяти.чтобы работала программа и для огромных матриц?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 17:55     Как расширить работоспособность программы
Еще ссылки по теме:

Как расширить длину строки до определённого значения? C++
C++ Как проверить работоспособность участка кода без остальной части программы?
Как проверить работоспособность интернета C++

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
13.12.2012, 17:55     Как расширить работоспособность программы #8
Грамотно выделить память можно так. Плюс к этому, можно пользоваться стандартными алгоритмами:
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
#include <iostream>
#include <algorithm>
#include <numeric>
#include <functional>
 
int main()
{
    const size_t size = 30;
 
    int** A = new int*[size];              //матрица А
    A[0] = new int[size*size];
    for (size_t i = 1; i<size; ++i)
        A[i] = A[i-1]+size;
 
    std::fill(A[0], A[0]+size*size, 2);   //заполняем двойками
 
    int** B = new int*[size];              //матрица В
    B[0] = new int[size*size];
    for (size_t i = 1; i<size; ++i)
        B[i] = B[i-1]+size;
 
    std::fill(B[0], B[0]+size*size, 3);   //заполняем тройками
 
    int** C = new int*[size];              //матрица C - результирующа
    C[0] = new int[size*size];
    for (size_t i = 1; i<size; ++i)
        C[i] = C[i-1]+size;
 
    //умножение:
    std::transform( A[0], A[0]+size*size, B[0], C[0], std::multiplies<int>() );
 
    //вывод результата:
    for (size_t i = 0; i<size; ++i)
    {
        for (size_t j = 0; j<size; ++j)
        {
            std::cout<<C[i][j]<<" ";
        }
        std::cout<<"\n";
    }
 
    //суммирование
    std::transform( A[0], A[0]+size*size, B[0], C[0], std::plus<int>() );
 
    //вывод результата:
    std::cout<<"\n\n------------------------------------------------------------\n\n\n";
    for (size_t i = 0; i<size; ++i)
    {
        for (size_t j = 0; j<size; ++j)
        {
            std::cout<<C[i][j]<<" ";
        }
        std::cout<<"\n";
    }
 
    system("pause");
    return 0;
}
Добавлено через 2 минуты
Удалять, к примеру, так:
C++
1
2
delete[] A[0];
delete[] A;
Yandex
Объявления
13.12.2012, 17:55     Как расширить работоспособность программы
Ответ Создать тему
Опции темы

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